从 Pandas Column 解压字典

Posted

技术标签:

【中文标题】从 Pandas Column 解压字典【英文标题】:Unpack dictionary from Pandas Column 【发布时间】:2018-11-03 20:22:47 【问题描述】:

我有一个数据框,其中有一个列作为字典。我想将它解压缩成多个列(即代码、数量是下面原始列格式中的单独列)。以下代码用于处理 pandas v0.22,现在 (0.23) 出现索引错误:

pd.DataFrame.from_records(df.col_name.fillna(pd.Series(['code':'not applicable'], index=df.index)).values.tolist())

ValueError: Length of passed values is 1, index implies x

我在 google/stack overflow 上搜索了几个小时,但之前提出的其他解决方案都不再起作用了。

原始列格式:

     dict_codes
0   'code': 'xx', 'amount': '10.00',...
1   'code': 'yy', 'amount': '20.00'...
2   'code': 'bb', 'amount': '30.00'...
3   'code': 'aa', 'amount': '40.00'...
10  'code': 'zz', 'amount': '50.00'...
11                            NaN
12                            NaN
13                            NaN

有人有什么建议吗?

谢谢

【问题讨论】:

【参考方案1】:

设置

df = pd.DataFrame(dict(
    codes=[
        'amount': 12, 'code': 'a',
        'amount': 19, 'code': 'x',
        'amount': 37, 'code': 'm',
        np.nan,
        np.nan,
        np.nan,
    ]
))

df

                         codes
0  'amount': 12, 'code': 'a'
1  'amount': 19, 'code': 'x'
2  'amount': 37, 'code': 'm'
3                          NaN
4                          NaN
5                          NaN

applypd.Series

请务必先dropna

df.codes.dropna().apply(pd.Series)

   amount code
0      12    a
1      19    x
2      37    m

df.drop('codes', 1).assign(**df.codes.dropna().apply(pd.Series))

   amount code
0    12.0    a
1    19.0    x
2    37.0    m
3     NaN  NaN
4     NaN  NaN
5     NaN  NaN

tolistfrom_records

同样的想法,但跳过apply

pd.DataFrame.from_records(df.codes.dropna().tolist())

   amount code
0      12    a
1      19    x
2      37    m

df.drop('codes', 1).assign(**pd.DataFrame.from_records(df.codes.dropna().tolist()))

   amount code
0    12.0    a
1    19.0    x
2    37.0    m
3     NaN  NaN
4     NaN  NaN
5     NaN  NaN

【讨论】:

这里的挑战是 .dropna() 版本基本上重置索引,这意味着我失去了任何位置方面。我的方案涉及根据索引将此列与不同的列连接。 dropna重置索引。它只会增加职位。您可以使用原始索引reindex 回到原来的位置。我通过assign 方法间接重新索引。 dropna().tolist() 据我所知,取出项目的索引。您能否详细说明我如何使用重新索引来例如在它们的位置添加 NaN? (在您的示例中,如果 NaN 散布 - 1 行 NaN 和 1 行实际项目)@piRSquared @DBa pd.DataFrame.from_dict(df.codes.dropna().to_dict(), orient='index').reindex(df.index) 或根据您的初始解决方案:df.drop('codes', 1).assign(**pd.DataFrame.from_records(df.codes.dropna().tolist(), index = df.codes.dropna().index))。谢谢,我会添加这个作为解决方案!【参考方案2】:

设置

                        codes
0  'amount': 12, 'code': 10
1    'amount': 3, 'code': 3

applypd.Series

df.codes.apply(pd.Series)

   amount  code
0      12    10
1       3     3

【讨论】:

谢谢,它可以工作,但会发出警告:RuntimeWarning: '

以上是关于从 Pandas Column 解压字典的主要内容,如果未能解决你的问题,请参考以下文章

Python- 在 Pandas Slicer 中解压列表

003.pandas.DataFrame

003.pandas.DataFrame

使用字典作为参数映射 Pandas 系列,其中值是元组

如何将 Pandas DataFrame 中字典的字符串表示形式转换为新列?

pandas:从字典创建数据框