仅在选定的行和列上使用熊猫分组

时间:2019-12-16 09:43:12

标签: python pandas dataframe pandas-groupby

对于以下数据框,我需要为每个2017-032017-05type选择行,然后通过grouby type并为v2计算均值v3

  type     date  v1  v2  v3
0    a  2017-01   8  16  32
1    a  2017-02   3   6  12
2    a  2017-03   6  12  24
3    a  2017-04   6  12  24
4    a  2017-05   5  10  20
5    b  2017-01   4   8  16
6    b  2017-02   3   6  12
7    b  2017-03   5  10  20
8    b  2017-04   9  18  36
9    b  2017-05   4   8  16

切片的数据帧将如下所示:

  type     date  v2  v3
0    a  2017-03  12  24
1    a  2017-04  12  24
2    a  2017-05  10  20
3    b  2017-03  10  20
4    b  2017-04  18  36
5    b  2017-05   8  16

我的期望将如下所示:

  type     v2     v3
0    a  11.33  22.67
1    b  12.00  24.00

我该怎么做?谢谢。

2 个答案:

答案 0 :(得分:4)

您用文字描述了如下内容:

(df.loc[df['date'].between('2017-03', '2017-05')]
   .drop(['v1'], 1) 
   .groupby('type', as_index=False)
   .mean())

  type         v2         v3
0    a  11.333333  22.666667
1    b  12.000000  24.000000

P.S:“日期”不需要像datetime列那样对待,因为可以按字典顺序比较“ YYYY-MM”日期。

答案 1 :(得分:1)

您可以在列表中的loc中选择列:

df['date'] = pd.to_datetime(df['date']).dt.to_period('m')

df1 = (df.loc[df['date'].between('2017-03', '2017-05'), ['v2','v3']]
         .groupby(df['type'])
         .mean()
         .reset_index())
print (df1)
  type         v2         v3
0    a  11.333333  22.666667
1    b  12.000000  24.000000

或者您可以对所有没有v1的列使用Index.difference

cols = df.columns.difference(['v1'])
df1 = (df.loc[df['date'].between('2017-03', '2017-05'), cols]
        .groupby('type', as_index=False)
        .mean())

print (df1)
  type         v2         v3
0    a  11.333333  22.666667
1    b  12.000000  24.000000