【问题标题】:how to extract data from column which looks like a dictionary in Pandas?如何从看起来像 Pandas 中的字典的列中提取数据?
【发布时间】:2021-05-26 10:12:48
【问题描述】:

您好,我是 pandas/python 的新手,正在尝试读取 pandas 中的 txt 文件 我想为每一行提取keyvalue 对。 将key 设为新列名,将其各自的value 设为值。

输入

data   
{'Name': 'Tim', 'Class': 'Ninth', 'Hobbies' : 'Football'} 
{'Name': 'Tom', 'Class': 'Ninth', 'Hobbies' : 'Football'}
{'Name': 'Jim', 'Class': 'Ninth', 'Hobbies' : 'Football'}
{'Name': 'John', 'Class': 'Ninth'}

预期输出

Name    Class   Hobbies
Tim Ninth   Football
Tom Ninth   Football
Jim Ninth   Football
John    Ninth   NA
import pandas as pd

df1 = pd.read_csv('9data.txt',sep = '\t')
df1['Name'] = df1['data'].apply(lambda x : x.values()[1])
print(df1)

错误:AttributeError:'str'对象没有属性'values'

有什么方法可以在pandas 中做到这一点?

【问题讨论】:

  • pd.DataFrame(df1['data'].tolist())?
  • @Anurag Dabas - 应该可以,但是该数据的呈现方式似乎在行的末尾有空格,导致它是一个字符串。也许这就是它的粘贴方式,但如果你的公式有效,那就太好了。否则下面的作品。

标签: pandas dataframe


【解决方案1】:

按照读取数据的方式,我可以使用eval() 为其获取一个新的数据框。这将遍历每个单元格,创建一个新的数据框,然后将它们连接起来。

data='''data
{'Name': 'Tim', 'Class': 'Ninth', 'Hobbies' : 'Football'} 
{'Name': 'Tom', 'Class': 'Ninth', 'Hobbies' : 'Football'}
{'Name': 'Jim', 'Class': 'Ninth', 'Hobbies' : 'Football'}
{'Name': 'John', 'Class': 'Ninth'}'''

df = pd.read_csv(io.StringIO(data), sep='\t', engine='python')
df1 = pd.concat([pd.json_normalize(eval(x)) for x in df['data']])

输出

   Name  Class   Hobbies
0   Tim  Ninth  Football
0   Tom  Ninth  Football
0   Jim  Ninth  Football
0  John  Ninth       NaN

如果您可以让您的数据看起来像这样,这是 Anurag Dabas 提到的更简单的方法。您可以考虑先将文件读入列表,然后创建数据框,而不是从数据框创建数据框。

datal = [{'Name': 'Tim', 'Class': 'Ninth', 'Hobbies' : 'Football'},
{'Name': 'Tom', 'Class': 'Ninth', 'Hobbies' : 'Football'},
{'Name': 'Jim', 'Class': 'Ninth', 'Hobbies' : 'Football'},
{'Name': 'John', 'Class': 'Ninth'}]
df = pd.DataFrame(datal)
df

【讨论】:

  • (+1) 要结合这两种想法,您可以使用data_list = [eval(line) for line in io.StringIO(data)],然后使用df = pd.DataFrame(data_list)
猜你喜欢
  • 2021-07-20
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多