熊猫:按多列分组后创建单个大小和总和列

Bai*_*aig 4 python pandas

我有一个数据框,我在其中对 3 列进行 groupby 并汇总数字列的总和和大小。运行代码后

df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])
Run Code Online (Sandbox Code Playgroud)

我得到如下内容:

数据帧的图像

现在我想从主列中拆分我的大小子列并仅创建单个大小的列,但希望将总和列保留在主列标题下。我尝试了不同的方法但没有成功。这些是我尝试过但无法让事情为我工作的方法:

如何按对象计算pandas中组中的行数?

将 Pandas GroupBy 对象转换为 DataFrame

如果有人可以帮助我解决这个问题,将不胜感激。

问候,

piR*_*red 6

设置

d1 = pd.DataFrame(dict(
        year=np.random.choice((2014, 2015, 2016), 100),
        cntry=['United States' for _ in range(100)],
        State=np.random.choice(states, 100),
        Col1=np.random.randint(0, 20, 100),
        Col2=np.random.randint(0, 20, 100),
        Col3=np.random.randint(0, 20, 100),
    ))

df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum'])
df
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


答案
最简单的方法本来只运行sizegroupby

d1.groupby(['year', 'cntry', 'State']).size()

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
dtype: int64
Run Code Online (Sandbox Code Playgroud)

使用计算的 df

df.xs('size', axis=1, level=1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果size每列不同,这将很有用。但是因为size列是相同的['Col1', 'Col2', 'Col3'],所以我们可以做

df[('Col1', 'size')]

year  cntry          State        
2014  United States  California       10
                     Florida           9
                     Massachusetts     8
                     Minnesota         5
2015  United States  California        9
                     Florida           7
                     Massachusetts     4
                     Minnesota        11
2016  United States  California        8
                     Florida           8
                     Massachusetts    11
                     Minnesota        10
Name: (Col1, size), dtype: int64
Run Code Online (Sandbox Code Playgroud)

组合视图 1

pd.concat([df[('Col1', 'size')].rename('size'),
           df.xs('sum', axis=1, level=1)], axis=1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


组合视图 2

pd.concat([df[('Col1', 'size')].rename(('', 'size')),
           df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明