У меня есть рамка данных pandas, как показано ниже.
DF1 =
sid path
1 '["rome","is","in","province","lazio"]'
1 "['rome', 'is', 'in', 'province', 'naples']"
1 ['N']
1 "['rome', 'is', 'in', 'province', 'in', 'campania']"
....
Я хочу удалить все ненужные символы path
столбца, чтобы результат выглядел так:
DF2 =
sid path
1 rome is in province lazio
1 rome is in province naples
1 N
1 rome is in province in campania
....
Я попытался заменить все ненужные символы следующим образом:
DF1["path"].replace("[","").replace("]","").replace('"',"").replace(","," ").replace("'","")
Но это не сработало. Я полагаю, что это связано с записями ["N"]
Как я могу это сделать? Любая помощь приветствуется!
Использование ast.literal_eval
& str.join
Демо - версия:
import pandas as pd
import ast
df = pd.DataFrame({"path": ['["rome","is","in","province","lazio"]', "['rome', 'is', 'in', 'province', 'naples']", ['N']]})
df['path'] = df['path'].astype(str).apply(ast.literal_eval).apply(lambda x: " ".join(x))
print(df)
Выход:
path
0 rome is in province lazio
1 rome is in province naples
2 N
Вы можете использовать ast.literal_eval
для безопасного вывода списков в виде строк. Один из способов учета подлинности списков состоит в том, чтобы поймать ValueError
.
Обратите внимание, что, если это вообще возможно, вы должны попытаться сортировать эти проблемы вверх по течению до того, как они достигнут вашего фрейма данных.
from ast import literal_eval
df = pd.DataFrame({'sid': [1, 1, 1, 1],
'path': ['["rome","is","in","province","lazio"]',
"['rome', 'is', 'in', 'province', 'naples']",
['N'],
"['rome', 'is', 'in', 'province', 'in', 'campania']"]})
def converter(x):
try:
return ' '.join(literal_eval(x))
except ValueError:
return ' '.join(x)
df['path'] = df['path'].apply(converter)
print(df)
path sid
0 rome is in province lazio 1
1 rome is in province naples 1
2 N 1
3 rome is in province in campania 1
ast.literal_eval
и plain eval
?
eval
небезопасен и не рекомендуется.
astype(str)
должно помочь ......list
->str
->list
.