如何在pandas数据框上应用两次groupby?

5

我有一个带有'year', 'month'和'transaction id'列的pandas数据框。 我想获取每年每月的交易数量。例如,我的数据如下:

year: {2015,2015,2015,2016,2016,2017}
month: {1,  1,   2,   2,   2,    1}
tid: {123,  343, 453, 675, 786, 332}

我希望获得这样的输出,即每年每月的交易次数。例如,对于2015年,我将获得以下输出:

month: [1,2]
count: [2,1]

我使用了groupby('year')。但是之后我该如何获取每月交易次数呢?
2个回答

9
您需要按照列 -“年份”和“月份”进行groupby,然后聚合size
year = [2015,2015,2015,2016,2016,2017]
month =  [1,  1,   2,   2,   2,    1]
tid = [123,  343, 453, 675, 786, 332]

df = pd.DataFrame({'year':year, 'month':month,'tid':tid})
print (df)
   month  tid  year
0      1  123  2015
1      1  343  2015
2      2  453  2015
3      2  675  2016
4      2  786  2016
5      1  332  2017

df1 = df.groupby(['year','month'])['tid'].size().reset_index(name='count')
print (df1)
   year  month  count
0  2015      1      2
1  2015      2      1
2  2016      2      2
3  2017      1      1

1

更复杂任务的另一个选项——假设您想按“年份”和应用于“tid”的函数进行分组,例如桶分类。

def tidBucket(x):
   if x<300:             return "low"
   if (300<=x & x<700):  return "medium"
   if 700<=x:            return "high"

那么上述解决方案将不起作用。您可以通过先按年份分组,然后使用另一个groupby迭代组对象的内容来解决此问题:

gb = df.groupby(by='year') #['tid'].size().reset_index(name='count')
for _,df1 in gb:
    df1.index = df1["tid"]
    df1 = df1.groupby(by=tidBucket)

然后按需要进行聚合。或者,您可以创建一个额外的“bucket”列。

df["bucket"] = df["tid"].map(tidBucket)

并且按照 @jezrael 的解决方案进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接