按组添加小计到Pandas Dataframe

时间:2017-07-26 02:20:43

标签: python pandas dataframe

我发现自己正在尝试用经常用R data.table做的大熊猫。我认为我能够明确地描述我想要的最好的方法是通过显示类似的R操作:

fruit <- rep(c('apples', 'oranges'), 2)
date <- rep(c('2017-07-01', '2017-07-02'), each=2)
count <- 1:4

dat <- data.table(date, count, fruit)

dat变量现在包含看起来像这样的数据

         date count   fruit
1: 2017-07-01     1  apples
2: 2017-07-01     2 oranges
3: 2017-07-02     3  apples
4: 2017-07-02     4 oranges

假设我想按日期将所有计数相加,请将其称为&#34;水果&#34; &#34;总&#34;并将其添加到原始数据。要在R中实现这一目标,我可能会这样做(我认为这不是最优雅的方式,但我现在不要求R帮助......)

dat.total <- rbind(dat[, list(count=sum(count), fruit='total'), list(date)],
                   dat)

果然,dat.total看起来像这样:

         date count   fruit
1: 2017-07-01     3   total
2: 2017-07-02     7   total
3: 2017-07-01     1  apples
4: 2017-07-01     2 oranges
5: 2017-07-02     3  apples
6: 2017-07-02     4 oranges

所以......我试图用熊猫做这件事,我无法弄明白。就我而言:

import pandas as pd

fruit = ['apples', 'oranges'] * 2
date = ['2017-07-01', '2017-07-01', '2017-07-02', '2017-07-02']
count = [1, 2, 3, 4]

dat = pd.DataFrame({'fruit': fruit, 'date': date, 'count': count})

到目前为止,这么好。这是:

   count        date    fruit
0      1  2017-07-01   apples
1      2  2017-07-01  oranges
2      3  2017-07-02   apples
3      4  2017-07-02  oranges

一些谷歌搜索让我到目前为止获得每个日期的总和:

agg = dat.groupby('date').sum()

但这已经成问题了。 agg似乎与dat有着根本不同的 thing 。 (把手指放在我的意思的一个特定部分上,agg.index是日期列,而dat.index是默认的RangeIndex)

我无法弄清楚如何添加水果&#34;列&#34;总&#34;对于每个值,即使我可以,我也不知道由于索引/列的不同,我可以很容易地连接这些东西。

似乎我的方法完全错了,但我很难搞清楚google的内容。

只是要清楚地知道我到底想要做什么:我希望得到一只大熊猫DataFame,它与我在开始时展示的R转换相似。我想 TL; DR 是我试图去的地方:

         date count   fruit
1: 2017-07-01     1  apples
2: 2017-07-01     2 oranges
3: 2017-07-02     3  apples
4: 2017-07-02     4 oranges

         date count   fruit
1: 2017-07-01     3   total
2: 2017-07-02     7   total
3: 2017-07-01     1  apples
4: 2017-07-01     2 oranges
5: 2017-07-02     3  apples
6: 2017-07-02     4 oranges

agg = dat.groupby('date').sum()的第一步似乎很有希望,但我不知道下一步该去哪,或者这已经走错了路。

1 个答案:

答案 0 :(得分:3)

使用groupbyappendassign

的组合
df.groupby('date')['count'].sum().reset_index() \
    .assign(fruit='total').append(df, ignore_index=True)

         date  count    fruit
0  2017-07-01      3    total
1  2017-07-02      7    total
2  2017-07-01      1   apples
3  2017-07-01      2  oranges
4  2017-07-02      3   apples
5  2017-07-02      4  oranges