如何对熊猫中按两列分组的值求和


21

我有一个这样的Pandas DataFrame:

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

我如何生成这样的新DataFrame:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

Answers:


16

pivot_table 为此:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

结果是

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

我个人认为,这种方法比复杂的groupby操作更容易理解,并且肯定比Python更复杂。然后,如果要指定格式,则可以整理一下:

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

这给你

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
真好!这应该是公认的答案。
tuomastik

@Josh D.这很酷,很简单!我同意,需要一些脑力才能弄清楚groupby的工作原理。谢谢!
凯文

8

熊猫黑魔法:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

结果df

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

圣!黑魔法是如此强大!非常感谢!
凯文(Kevin)

别客气!查看更新后的答案;我简化了表达式,并添加了一个修正,使列名完全符合要求。
tuomastik

我认为您的先前版本具有优势,因为它可以应用于其他更复杂的数据集。我在这里复制了它:df.groupby(['Date','Groups','data'])['data']。sum()。sum(level = ['Date','Groups'])。unstack( 'Groups')。fillna(0)
凯文

@Kevin如果此答案或以后的任何答案解决了您的问题,请接受答案。
tuomastik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.