我有以下数据框(2016、2017、2018年有50000行):
data.head()
Values
Date
2016-07-20 10.0
2016-07-20 10.0
2016-07-22 1.0
2016-07-22 1.0
2016-07-22 1.0
简单的groupby
:
data.groupby([(data1.index.year==2018),(data1.index.month==5)])['Values'].sum()
False False 1461787.35
True 80714.53
True False 862589.66
True 172600.04
Name: Values, dtype: float64
如何将False
和True
中的year
和month
更改为2018和5?
预期输出:
2018 5 80714.53
Name: Values, dtype: float64
答案 0 :(得分:2)
您仅需要按year
和month
s进行分组:
#changed data for better sample
print (data)
Values
Date
2015-07-20 10.0
2015-05-20 20.0
2016-05-20 2.0
2018-05-22 1.0
2018-05-22 3.0
2018-07-22 4.0
df1 = data.groupby([data.index.year, data.index.month])['Values'].sum()
print (df1)
Date Date
2015 5 20.0
7 10.0
2016 5 2.0
2018 5 4.0
7 4.0
Name: Values, dtype: float64
您的解决方案按布尔掩码分组,True
仅过滤了2018
年,并且False
都是非2018
行,类似于month
s:
df2 = data.groupby([(data.index.year==2018),(data.index.month==5)])['Values'].sum()
print (df2)
False False 10.0
True 22.0
True False 4.0
True 4.0
Name: Values, dtype: float64
如果仅希望使用过滤后的值,请使用:
df = data[(data.index.year==2018) & (data.index.month==5)]
print (df)
Values
Date
2018-05-22 1.0
2018-05-22 3.0
out = df.groupby([df.index.year, df.index.month])['Values'].sum()
print (out)
Date Date
2018 5 4.0
Name: Values, dtype: float64