从TSV处理字典列中的数据

时间:2018-07-12 16:23:21

标签: python pandas dictionary

我有一个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(任意示例)?

1 个答案:

答案 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'}]