首页 > 解决方案 > 数据框按嵌套字典中的路径分组

问题描述

DataFrame 的 groupby 支持按表中的列列表进行分组,例如:

from pandas import DataFrame as DF

data2 = [{'a':{'x':1,'y':2},'b':2, 'x0':1},{'a':{'x':3,'y':4},'b':4, 'x0':3},{'a':{'x':1,'y':6},'b':6, 'x0':1}]

(为了说明,请注意“x0”列与嵌套字典中的“x”重复)

这按预期工作:

DF(data2).groupby(['x0','b']).size().unstack()

在此处输入图像描述

如何模仿这种行为来代替嵌套'x''x0'

我尝试了一种lambda用于输出元组的方法:

DF(data2).groupby(lambda i: (data2[i]['a']['x'],data2[i]['b'])).size()

(1, 2)    1
(1, 6)    1
(3, 4)    1
dtype: int64

wheredata2[i]['x0']也可以作为第一个元组元素。在这两种情况下都会unstack抛出:

AttributeError: 'Index' object has no attribute 'remove_unused_levels'

所以列/字典键名没有正确处理。是否有就地解决方法,即不设置新变量或数据帧?

标签: pythonpandasdataframegroup-by

解决方案


我想如果你想使用 alambda expression你可以,但它不会比你的第一种方法更快:

df = pd.DataFrame(data2).groupby(lambda i: (data2[i]['a']['x'],data2[i]['b'])).size()

# create a multiindex which will allow yo to use unstack
df.index = pd.MultiIndex.from_tuples(df.index, names=['x0', 'b'])
df.unstack(level=1)

b    2   4   6
x0          
1   1.0 NaN 1.0
3   NaN 1.0 NaN

推荐阅读