Pandas 了解groupby

Pandas understanding groupby

我有如下数据框

import pandas as pd
import numpy as np
df = {'a': ['xxx', 'xxx','xxx','yyy','yyy','yyy'], 'start': [10000, 10500, 11000, 12000, 13000, 14000], 'day':['2018-10-08',
'2018-09-26',
'2018-08-07',
'2018-10-04',
'2019-02-06',
'2019-02-10'] }
df = pd.DataFrame(data=df)
df["day2"] = pd.to_datetime(df['day']).dt.date
print (df)
print (df.dtypes)



     a  start         day        day2
0  xxx  10000  2018-10-08  2018-10-08
1  xxx  10500  2018-09-26  2018-09-26
2  xxx  11000  2018-08-07  2018-08-07
3  yyy  12000  2018-10-04  2018-10-04
4  yyy  13000  2019-02-06  2019-02-06
5  yyy  14000  2019-02-10  2019-02-10
a        object
start     int64
day      object
day2     object
dtype: object

当我使用 as_index=False 时,我得到如下输出 - 这很有意义

df.groupby('a',as_index=False).agg({'start':'first','day2':'min'})
    a   start   day2
0   xxx 10000   2018-08-07
1   yyy 12000   2018-10-04

question 1) 但是为什么我在下面 运行 时没有得到 a 列?

df2=df.copy()
df4=df2.groupby('a',as_index=False)['day2'].apply(list)
print(df4)

0    [2018-10-08, 2018-09-26, 2018-08-07]
1    [2018-10-04, 2019-02-06, 2019-02-10]
dtype: object
===============================

如果我不使用 as_index=False,我会得到该列。

print ("===============================")
print (df2.groupby('a')['day2'].apply(list))
a
xxx    [2018-10-08, 2018-09-26, 2018-08-07]
yyy    [2018-10-04, 2019-02-06, 2019-02-10]










question 2) why `transform` is not working?

df2.groupby('a')['day2'].transform(list)
0    2018-10-08
1    2018-09-26
2    2018-08-07
3    2018-10-04
4    2019-02-06
5    2019-02-10
Name: day2, dtype: object

question 3) 是否有我可以与 groupby 一起使用的函数列表,例如 max, min, first, last

你的第一个问题 apply it 不会显示列,但我们可以 agg

df2.groupby('a',as_index=False)['day2'].agg(list)
Out[15]: 
     a                                  day2
0  xxx  [2018-10-08, 2018-09-26, 2018-08-07]
1  yyy  [2018-10-04, 2019-02-06, 2019-02-10]

修复转换

df2.groupby('a')['day2'].transform(lambda x : [x.tolist()]*len(x))
Out[19]: 
0    [2018-10-08, 2018-09-26, 2018-08-07]
1    [2018-10-08, 2018-09-26, 2018-08-07]
2    [2018-10-08, 2018-09-26, 2018-08-07]
3    [2018-10-04, 2019-02-06, 2019-02-10]
4    [2018-10-04, 2019-02-06, 2019-02-10]
5    [2018-10-04, 2019-02-06, 2019-02-10]
Name: day2, dtype: object

但是,下面的第二个问题对你来说更好

df2.a.map(df2.groupby('a')['day2'].agg(list))

关于你的第三个问题

df2.groupby(a)['day2'].agg(['max', 'min', 'first', 'last'])