从 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
apply
与 pd.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
tolist
和 from_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
apply
与 pd.Series
df.codes.apply(pd.Series)
amount code
0 12 10
1 3 3
【讨论】:
谢谢,它可以工作,但会发出警告:RuntimeWarning: '以上是关于从 Pandas Column 解压字典的主要内容,如果未能解决你的问题,请参考以下文章