分组依据,汇总,包括单独的列

时间:2019-04-07 02:05:04

标签: python pandas group-by aggregate

这是我的数据:

foo = pd.DataFrame({
    'accnt' : [101, 102, 103, 104, 105, 101, 102, 103, 104, 105],
    'gender' : [0, 1 , 0, 1, 0, 0, 1 , 0, 1, 0],
    'date' : pd.to_datetime(["2019-01-01 00:10:21", "2019-01-05 00:09:18", "2019-01-05 00:09:30", "2019-02-05 00:05:12", "2019-04-01 00:08:46",
             "2019-04-01 00:11:31", "2019-02-06 00:01:39", "2019-01-26 00:15:14", "2019-01-21 00:12:36", "2019-03-01 00:09:31"]),
    'value' : [10, 20, 30, 40, 50, 5, 2, 6, 48, 96]
                })

哪个是

   accnt    date                gender  value
0   101  2019-01-01 00:10:21       0    10
1   102  2019-01-05 00:09:18       1    20
2   103  2019-01-05 00:09:30       0    30
3   104  2019-02-05 00:05:12       1    40
4   105  2019-04-01 00:08:46       0    50
5   101  2019-04-01 00:11:31       0    5
6   102  2019-02-06 00:01:39       1    2
7   103  2019-01-26 00:15:14       0    6
8   104  2019-01-21 00:12:36       1    48
9   105  2019-03-01 00:09:31       0    96

我要执行以下操作: -按accnt分组,包括gender,最新的datelatest_date,交易次数为txn_count;导致:

  accnt  gender         latest_date        txn_count
   101      0       2019-04-01 00:11:31         2
   102      1       2019-02-06 00:01:39         2
   103      0       2019-01-26 00:15:14         2
   104      1       2019-02-05 00:05:12         2
   105      0       2019-04-01 00:08:46         2

在R中,我可以使用group_by中的summarisedplyr来做到这一点:

foo %>% group_by(accnt) %>% 
summarise(gender = last(gender), most_recent_order_date = max(date), order_count = n()) %>% data.frame()

我要使用last(gender)来包含它,因为对于任何genderaccnt都是相同的,因此我可以选择minmax或{ {1}}也可以。

我如何使用熊猫在python中做同样的事情?

我尝试过:

mean

但这会导致“额外”列名。我还想知道在结果中包括诸如foo.groupby('accnt').agg({'gender' : ['mean'], 'date': ['max'], 'value': ['count']}).rename(columns = {'gender' : "gender", 'date' : "most_recent_order_date", 'value' : "order_count"}) 之类的非聚合列的最佳方法是什么。

2 个答案:

答案 0 :(得分:2)

R中的summarise等于aggmutate等于transform

在列中具有多个索引的原因:由于您通过list传递了函数调用,这意味着您可以执行类似{'date':['mean','sum']}的操作

foo.groupby('accnt').agg({'gender' : 'first',
                          'date': 'max',
                          'value': 'count'}).rename(columns = {'date' : "most_recent_order_date",
                                                                 'value' : "order_count"}).reset_index()
Out[727]: 
   accnt most_recent_order_date  order_count  gender
0    101    2019-04-01 00:11:31            2       0
1    102    2019-02-06 00:01:39            2       1
2    103    2019-01-26 00:15:14            2       0
3    104    2019-02-05 00:05:12            2       1
4    105    2019-04-01 00:08:46            2       0

一些示例:在这里我一次调用了两个函数columns,这意味着应该在level中有两个index,以确保out列名称没有重复

foo.groupby('accnt').agg({'gender' : ['first','mean']})
Out[728]: 
      gender     
       first mean
accnt            
101        0    0
102        1    1
103        0    0
104        1    1
105        0    0

答案 1 :(得分:0)

对不起,您的回复很晚。这是我找到的解决方案。

# Pandas Operations
foo = foo.groupby('accnt').agg({'gender' : ['mean'],
                                'date': ['max'],
                                'value': ['count']})

# Drop additionally created column names from Pandas Operations
foo.columns = foo.columns.droplevel(1)

# Rename original column names
foo.rename( columns = { 'date':'latest_date',
                        'value':'txn_count'}, 
            inplace=True)

如果您要添加其他非聚合列,则可以简单地将新列追加到分组的foo数据框。

相关问题