【问题标题】:Unpack dictionary from Pandas Column从 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

有人有什么建议吗?

谢谢

【问题讨论】:

    标签: python python-3.x pandas dictionary


    【解决方案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: '
    猜你喜欢
    • 2021-02-13
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多