Python 分组依据、聚合、包含单独列
以下是我的数据:Python 分组依据、聚合、包含单独列,python,pandas,group-by,aggregate,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-0
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
我想做以下工作:
-按科目分组
,包括性别
,将最近的日期
作为最近的日期
,将交易数量计算为txn\u计数
;导致:
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中,我可以使用groupby
和summary
从dplyr
中执行此操作:
foo %>% group_by(accnt) %>%
summarise(gender = last(gender), most_recent_order_date = max(date), order_count = n()) %>% data.frame()
我把last(gender)
包括在内,因为gender
对于任何accnt
都是相同的,所以我也可以取min
、max
或mean
如何使用pandas在python中实现同样的功能
我试过:
foo.groupby('accnt').agg({'gender' : ['mean'],
'date': ['max'],
'value': ['count']}).rename(columns = {'gender' : "gender",
'date' : "most_recent_order_date",
'value' : "order_count"})
但这会导致“额外”列名。我还想知道,在结果中加入非聚合列(如
gender
)的最佳方式是什么。很抱歉反应太晚。我找到了一个解决办法
# 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数据框架中即可 在R
中总结
将等于agg
,变异
等于转换
在列中有多个索引的原因是:由于您使用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
举个例子:这里我为一个
列同时调用了两个函数,这意味着应该有两个级别的索引
,以确保列名称不重复
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