将熊猫数据框单元格中的字典解析为新行单元格(新列)

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

【讨论】:

以上是关于将熊猫数据框单元格中的字典解析为新行单元格(新列)的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框单元格中插入列表

如何在熊猫数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列

如何将 CSV 值与 pyspark 数据框中的单元格中的值分别分隔为新列及其值

熊猫将非空值从行中获取到一个单元格中[重复]

将单元格中的数据拆分为新列 Openoffice Calc

从熊猫数据框单元格中的凌乱字符串中删除换行符?