【问题标题】:Pandas: different way to access a string in columnPandas:访问列中字符串的不同方式
【发布时间】:2020-12-03 11:46:02
【问题描述】:

我有一个 df

name    manufacturer    information
John    Ford            {'city':'London', 'colour':'black' , 'year': '2017'}
Jane    Porsche         {'city':'Birmingham', 'colour':'red' , 'year': '2019'}  

我想创建一个 new_df,其中包含 'name' 和 'colour' 中的值

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[信息][颜色]

注意:关键字符串不会改变

【问题讨论】:

  • 要清楚,您的信息列中的值是字符串,例如:"{'city':'London', 'colour':'black' , 'year': '2017'}"?
  • 我最近回答了一些关于如何将 JSON 扩展为列的问题。使用pd.concat() 和pd.json_normalize()。 stackoverflow.com/questions/63395522/…
  • ALollz - 正确,是的

标签: python pandas string dictionary


【解决方案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'}"]})

【讨论】:

    【解决方案2】:

    解决办法如下:

    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)
    

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多