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)
apply 和 pd.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)
tolist 和 from_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)
设置
codes
0 {'amount': 12, 'code': 10}
1 {'amount': 3, 'code': 3}
Run Code Online (Sandbox Code Playgroud)
apply和pd.Series
df.codes.apply(pd.Series)
amount code
0 12 10
1 3 3
Run Code Online (Sandbox Code Playgroud)