Python 具有两个groupby的数据帧平均值:一个按月份,另一个按参数

Python 具有两个groupby的数据帧平均值:一个按月份,另一个按参数,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,包含日期(以yymmdd的形式)、名称和记录的数据框,如下所示: date name record 0 200104 A 16 1 200105 B 20 2 200105 A 18 3 200106 B 22 4 200201 A 14 5 200201 B 17 6 200202 A 18 7 200203 B 19 我需要按月份和姓名

包含日期(以yymmdd的形式)、名称和记录的数据框,如下所示:

     date name  record
0  200104    A      16
1  200105    B      20
2  200105    A      18
3  200106    B      22
4  200201    A      14
5  200201    B      17
6  200202    A      18
7  200203    B      19
我需要按月份和姓名分组,取记录的平均值,得出如下结果:

Jan  A  17
     B  21
Feb  A  16
     B  18
您能帮忙吗?

使用和合计平均值:

m = pd.to_datetime(df['date'], format='%y%m%d').dt.month_name().rename('month')

df = df.groupby([m,'name'], sort=False)['record'].mean().reset_index()
print (df)
      month name  record
0   January    A      17
1   January    B      21
2  February    A      16
3  February    B      18
或者,如有必要,只选择月份的前3个字母:

m = pd.to_datetime(df['date'], format='%y%m%d').dt.month_name().str[:3].rename('month')
df = df.groupby([m,'name'], sort=False)['record'].mean().reset_index()
print (df)

  month name  record
0   Jan    A      17
1   Jan    B      21
2   Feb    A      16
3   Feb    B      18
与总平均值一起使用:

m = pd.to_datetime(df['date'], format='%y%m%d').dt.month_name().rename('month')

df = df.groupby([m,'name'], sort=False)['record'].mean().reset_index()
print (df)
      month name  record
0   January    A      17
1   January    B      21
2  February    A      16
3  February    B      18
或者,如有必要,只选择月份的前3个字母:

m = pd.to_datetime(df['date'], format='%y%m%d').dt.month_name().str[:3].rename('month')
df = df.groupby([m,'name'], sort=False)['record'].mean().reset_index()
print (df)

  month name  record
0   Jan    A      17
1   Jan    B      21
2   Feb    A      16
3   Feb    B      18

您可以将日期转换为月份名称和分组依据:

(df.groupby([pd.to_datetime(df['date'],format='%y%m%d').dt.strftime('%b'),
            'name'])['record']
  .mean())
输出:

 date  name
Jan   A       17
      B       21
Feb   A       16
      B       18
Name: record, dtype: int64

您可以将日期转换为月份名称和分组依据:

(df.groupby([pd.to_datetime(df['date'],format='%y%m%d').dt.strftime('%b'),
            'name'])['record']
  .mean())
输出:

 date  name
Jan   A       17
      B       21
Feb   A       16
      B       18
Name: record, dtype: int64

抱歉,我需要解释更多:日期是以yymmdd的形式。@Brom-编辑,如果下一个月都使用正确的顺序解决方案如果我只使用一月、二月,我可以不使用
列表
猫吗?太棒了!它按月份分类。如果我有从去年5月到今年4月的数据,它将以5月开始,而不是按字母顺序。对不起,我需要解释更多:日期是以yymmdd的形式。@Brom-编辑,解决方案顺序正确如果所有下个月我只使用1月、2月,我可以不使用
列表
猫吗?太棒了!它按月份分类。如果我有从去年5月到今年4月的数据,它将以5月开始,而不是按字母顺序。对不起,日期的形式是yymmdd,所以应该只有一月和二月的平均值。或者,日期的形式是yymmdd,所以应该只有一月和二月的平均值