从 Pandas Column 解压字典

DBa*_*DBa 10 python dictionary python-3.x pandas

我有一个数据框,其中一列作为字典。我想将它解包成多列(即代码,金额是下面原始列格式中的单独列)。以下代码用于使用 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
Run Code Online (Sandbox Code Playgroud)

我在 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
Run Code Online (Sandbox Code Playgroud)

有没有人有什么建议?

谢谢

piR*_*red 17

设置

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
Run Code Online (Sandbox Code Playgroud)

applypd.Series

确保dropna

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

   amount code
0      12    a
1      19    x
2      37    m
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

tolistfrom_records

同样的想法,但跳过 apply

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

   amount code
0      12    a
1      19    x
2      37    m
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)


use*_*203 5

设置

                        codes
0  {'amount': 12, 'code': 10}
1    {'amount': 3, 'code': 3}
Run Code Online (Sandbox Code Playgroud)

applypd.Series

df.codes.apply(pd.Series)

   amount  code
0      12    10
1       3     3
Run Code Online (Sandbox Code Playgroud)