将熊猫数据框单元格中的字典解析为新行单元格(新列)
Posted
技术标签:
【中文标题】将熊猫数据框单元格中的字典解析为新行单元格(新列)【英文标题】:parsing a dictionary in a pandas dataframe cell into new row cells (new columns) 【发布时间】:2017-01-31 03:26:21 【问题描述】:我有一个 Pandas 数据框,其中包含一列,其中包含包含键值对字典的单元格,如下所示:
"name":"Test Thorton","company":"Test Group","address":"10850 Test #325\r\n","city":"Test City","state_province":"CA","postal_code":"95670","country":"USA","email_address":"test@testtest.com","phone_number":"999-888-3333","equipment_description":"I'm a big red truck\r\n\r\nRSN# 0000","response_desired":"week","response_method":"email"
我正在尝试解析字典,因此生成的 Dataframe 包含每个键的新列,并且该行填充了每列的结果值,如下所示:
//Before
1 2 3 4 5
a b c d 6:y, 7:v
//After
1 2 3 4 5 6 7
a b c d 6:y, 7:v y v
非常感谢您的建议。
【问题讨论】:
【参考方案1】:考虑df
df = pd.DataFrame([
['a', 'b', 'c', 'd', dict(F='y', G='v')],
['a', 'b', 'c', 'd', dict(F='y', G='v')],
], columns=list('ABCDE'))
df
A B C D E
0 a b c d 'F': 'y', 'G': 'v'
1 a b c d 'F': 'y', 'G': 'v'
选项 1
使用pd.Series.apply
,就地分配新列
df.E.apply(pd.Series)
F G
0 y v
1 y v
这样分配
df[['F', 'G']] = df.E.apply(pd.Series)
df.drop('E', axis=1)
A B C D F G
0 a b c d y v
1 a b c d y v
选项 2
使用pd.DataFrame.assign
方法流水线化整个过程
df.drop('E', 1).assign(**pd.DataFrame(df.E.values.tolist()))
A B C D F G
0 a b c d y v
1 a b c d y v
【讨论】:
我喜欢选项 1 ❤️。谢谢你,先生! 选项 2 为我节省了很多小时的挫败感。 apply(pd.Series) 甚至不是大数据的选项【参考方案2】:我觉得你可以用concat
:
df = pd.DataFrame(1:['a','h'],2:['b','h'], 5:[6:'y', 7:'v',6:'u', 7:'t'] )
print (df)
1 2 5
0 a b 6: 'y', 7: 'v'
1 h h 6: 'u', 7: 't'
print (df.loc[:,5].values.tolist())
[6: 'y', 7: 'v', 6: 'u', 7: 't']
df1 = pd.DataFrame(df.loc[:,5].values.tolist())
print (df1)
6 7
0 y v
1 u t
print (pd.concat([df, df1], axis=1))
1 2 5 6 7
0 a b 6: 'y', 7: 'v' y v
1 h h 6: 'u', 7: 't' u t
时间安排 (len(df)=2k
):
In [2]: %timeit (pd.concat([df, pd.DataFrame(df.loc[:,5].values.tolist())], axis=1))
100 loops, best of 3: 2.99 ms per loop
In [3]: %timeit (pir(df))
1 loop, best of 3: 625 ms per loop
df = pd.concat([df]*1000).reset_index(drop=True)
print (pd.concat([df, pd.DataFrame(df.loc[:,5].values.tolist())], axis=1))
def pir(df):
df[['F', 'G']] = df[5].apply(pd.Series)
df.drop(5, axis=1)
return df
print (pir(df))
【讨论】:
以上是关于将熊猫数据框单元格中的字典解析为新行单元格(新列)的主要内容,如果未能解决你的问题,请参考以下文章
如何在熊猫数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列