嵌套字典的三个pandas列



我有一个3列的数据框架

c1   c2  c3
0  A   C    1
1  A   D    2
2  B   E    3
3  B   E    4

我想把它变成一个嵌套字典,所以像{'A': {'C': [1], 'D': [2]}, 'B': {'E': [3,4]}

我该怎么做?谢谢!

尝试使用groupbyto_dict:

>>> df.groupby('c1').apply(lambda x: pd.DataFrame(zip(x['c2'], x['c3'])).groupby(0)[1].apply(list).to_dict()).to_dict()
{'A': {'C': [1], 'D': [2]}, 'B': {'E': [3, 4]}}
>>> 

我们可以使用字典理解,groupby aggregateSeries.to_dict的组合:

output = {
c1: g_df.groupby('c2')['c3'].agg(list).to_dict()
for c1, g_df in df.groupby('c1')
}

output:

{'A': {'C': [1], 'D': [2]}, 'B': {'E': [3, 4]}}

DataFrame and imports:

import pandas as pd
df = pd.DataFrame({
'c1': ['A', 'A', 'B', 'B'],
'c2': ['C', 'D', 'E', 'E'],
'c3': [1, 2, 3, 4]
})

还有一种方法可以尝试:

out=(df.groupby(['c1','c2']).agg(list).unstack(0).droplevel(0,1)
.agg(lambda x:dict(x.dropna())).to_dict())

输出:

{'A': {'C': [1], 'D': [2]}, 'B': {'E': [3, 4]}}

让我们试试

s = df.groupby(['c1','c2'])['c3'].agg(list)
d = {l: s.xs(l).to_dict() for l in s.index.levels[0]}
d
Out[31]: {'A': {'C': [1], 'D': [2]}, 'B': {'E': [3, 4]}}

最新更新