对于以下数据框,我需要为每个2017-03
从2017-05
到type
选择行,然后通过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
我该怎么做?谢谢。
答案 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