嵌套di中的数据帧groupby路径

2024-04-26 19:01:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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”列与嵌套dict中的“x”重复)

其工作原理如下:

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

enter image description here

如何用嵌套的'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

其中data2[i]['x0']也用作第一个元组元素。在这两种情况下unstack抛出:

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

因此列/dict键名没有得到正确处理。是否有就地解决方法(即不设置新变量或数据帧)?你知道吗


Tags: 方法lambdafromimportdataframepandasdf列表
2条回答

使用pd.DataFrame.from\ U目录():

import pandas as pd

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

df = pd.DataFrame.from_dict(data2)
df = df.groupby(['x','b']).size().unstack()
print(df)

输出

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

我想如果您想使用lambda 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

相关问题 更多 >