从dataFrame到TypeError的列表:字符串索引必须是整数

时间:2018-06-14 18:51:54

标签: python python-3.x pandas lambda

我想在最后创建一个如下所示的列表:

[
    {'name': 'Chrome', 'y': 550},
    {'name': 'IE', 'y': 203},
]

我的数据框是:

df = pd.DataFrame({"CATEGORY":["Chrome","IE","FireFox","Safari","Opera","QQ"],"Users":[550,203,25,305,15,132]})

为了实现这一点,我尝试这样的事情:

list(map(lambda row: {'name': df[row['CATEGORY']], 'y': row['Users']}, df))

但我得到的结果是: TypeError:字符串索引必须是整数

任何人都可以指出(1)我做错了什么,(2)如何修复它?

2 个答案:

答案 0 :(得分:1)

您可以使用:

df.columns = ['name', 'y'] # change the column names to the ones that you want
df.to_dict('records') # this returns a list of dictionaries for each row

[{'name': 'Chrome', 'y': 550},
{'name': 'IE', 'y': 203},
 {'name': 'FireFox', 'y': 25},
 {'name': 'Safari', 'y': 305},
 {'name': 'Opera', 'y': 15},
 {'name': 'QQ', 'y': 132}]

答案 1 :(得分:1)

您需要将.apply()axis=1一起使用才能访问列。当你走的时候,你需要构建你的字典。

list(df.apply(lambda x: {'name': x['CATEGORY'], 'y': x['Users']}, axis=1))

输出:

[{'name': 'Chrome', 'y': 550},
 {'name': 'IE', 'y': 203},
 {'name': 'FireFox', 'y': 25},
 {'name': 'Safari', 'y': 305},
 {'name': 'Opera', 'y': 15},
 {'name': 'QQ', 'y': 132}]

感谢修复您的方法。然而,理想方式是使用to_dict(),如下所示:

df.rename(columns={'CATEGORY': 'name', 'Users': 'y'}).to_dict(orient='records')

输出:

[{'name': 'Chrome', 'y': 550},
 {'name': 'IE', 'y': 203},
 {'name': 'FireFox', 'y': 25},
 {'name': 'Safari', 'y': 305},
 {'name': 'Opera', 'y': 15},
 {'name': 'QQ', 'y': 132}]

这样原来的df也不会受到影响。