我有一个df
name manufacturer information
John Ford {'city':'London', 'colour':'black' , 'year': '2017'}
Jane Porsche {'city':'Birmingham', 'colour':'red' , 'year': '2019'}
我想创建一个new_df,其中包含“名称”和“颜色”中的值
name colour
John black
Jane red
不幸的是,由于数据的预处理方式以及我仅提供了一个csv的事实,“信息”是一个字符串(熊猫对象),而不是一个嵌套的字典。我知道数据不应像这样嵌套在单个列中,这确实很烦人,但不受我的控制。
我当前的解决方案是
colour_col = []
for i in df['information']:
colour_col.append(i.split('\'')[7])
df['colour'] = colour_col
new_df = df[['name', 'colour']]
目前有效。但是,如果更改了“颜色”值的位置,则代码将掉落。另外,代码可能会运行但数据不正确。
是否有一种有效的方法来实现遵循最佳实践的new_df?我可以将['information']列转换回嵌套词典并通过字符串访问值吗?像new_df = df [information] [colour]
注意:密钥字符串不会更改
答案 0 :(得分:1)
您可以使用ast
将这些字符串评估为字典,然后让我们一次获取所有信息,因为这是一个缓慢的应用。从那里,您可以放下'information'
列并使用普通的DataFrame。
import pandas as pd
import ast
df = pd.concat([df.drop(columns='information'),
df['information'].apply(lambda x: pd.Series(ast.literal_eval(x)))], axis=1)
name manufacturer city colour year
0 John Ford London black 2017
1 Jane Porsche Birmingham red 2019
df = pd.DataFrame({'name': ['John', 'Jane'], 'manufacturer': ['Ford', 'Porsche'],
'information': ["{'city':'London', 'colour':'black' , 'year': '2017'}",
"{'city':'Birmingham', 'colour':'red' , 'year': '2019'}"]})
答案 1 :(得分:1)
这是解决方案:
import json
colour_col = []
for i in df['information']:
jsonStr = json.loads(i.replace("'", '"'))
colour_col.append(jsonStr['colour'])
df['colour'] = colour_col
new_df = df[['name', 'colour']]
print(new_df)