熊猫:以不同方式访问列中的字符串

时间:2020-08-13 15:27:29

标签: python pandas string dictionary

我有一个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]

注意:密钥字符串不会更改

2 个答案:

答案 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)