我有一个TSV文件,其中的一列是字典格式的类型。
标题和一行示例(请注意“首选项”列中的字符串引号)
Name, Age, Preferences
Nick, 18, "[{"Hobby":"Football", "Food":"Pizza", "FavoriteNumber":"72"}]"
要将文件读入python:
df = pd.read_csv('search_data_assessment.tsv',delimiter='\t')
为了删除开头和结尾的“首选项”的字符串,我使用了ast.literal_eval:
df["Preferences"] = ast.literal_eval(df["Preferences"])
这会引发“ ValueError:格式错误的节点或字符串:0”,但这似乎可以解决问题。
问题:如何检查所有行并在“首选项”中查找“ FavoriteNumber”,如果它== 72,将其更改为100(任意示例)?
答案 0 :(得分:0)
您可以将pd.Series.apply
与自定义功能一起使用。请注意,这与滥用熊猫接壤。 Pandas并非旨在容纳一系列词典。在这里,您正在以一种特别低效的方式运行循环。
from ast import literal_eval
df = pd.DataFrame([['Nick', 18, '[{"Hobby":"Football", "Food":"Pizza", "FavoriteNumber":"72"}]']],
columns=['Name', 'Age', 'Preferences'])
def updater(x):
if x[0]['FavoriteNumber'] == '72':
x[0]['FavoriteNumber'] = '100'
return x
df['Preferences'] = df['Preferences'].apply(literal_eval)
df['Preferences'] = df['Preferences'].apply(updater)
print(df['Preferences'].iloc[0])
[{'Hobby': 'Football', 'Food': 'Pizza', 'FavoriteNumber': '100'}]