考虑以下数据:
date | value
--------+--------
2004 | 1
2005 | 2
2006 | 3
2007 | 4
2008 | 5
2009 | 6
我需要对5年期间的值求和,因此数据看起来像这样:
date | value
--------+--------
2005 | 3
2010 | 18
我怎样才能做到这一点?我是一个初学者,所以我甚至都不知道从哪里开始。
答案 0 :(得分:2)
考虑使用数学: - )
df.groupby(((df.date-1)//5+1)*5).value.sum().to_frame(name='value')
Out[185]:
value
date
2005 3
2010 18
答案 1 :(得分:1)
这是pd.cut的一种方法:
years = pd.cut(
df['date'], bins=np.arange(1900, 2100, 5) # You can play with these limits
).cat.remove_unused_categories()
df.groupby(years)['value'].sum()
Out:
date
(2000, 2005] 3
(2005, 2010] 18
Name: value, dtype: int64
答案 2 :(得分:1)
快速演示如何进行此操作。您制作索引以跟踪已处理的数量:
years= [2004, 2005, 2006, 2007, 2008, 2009, 2010]
data= [1,2,3,4,5,6,7]
fifths=0
for i in range(len(years)//5+1):
print(years[fifths], sum(data[fifths:fifths+5]))
fifths+=5
您将获得输出:
2004 15
2009 13
答案 3 :(得分:1)
这个答案有点暴力和不那么优雅,但它以非常清晰和可读的方式展示了一些更基本的熊猫数据框架构建操作。我认为随着时间的推移,你会找到更优雅的方法。
import pandas as pd
# Prepare data set for dataframe
table = [['year','value']]
value = 0
for year in range(2004,2010,1):
value += 1
array = [year, value]
table.append(array)
headers = table.pop(0)
df = pd.DataFrame(table, columns=headers)
# Bucketize the data in a new dataframe
tableNew = [['year','value']]
sum = 0
for i in range(len(df)):
year = df.iloc[i]['year']
value = df.iloc[i]['value']
sum += value
if (year % 5) == 0:
tableNew.append([year, sum])
sum = 0
while year % 5 != 0:
i += 1
year += 1
value = 0
sum += value
if (year % 5) == 0:
tableNew.append([year, sum])
newHeaders = tableNew.pop(0)
dfNew = pd.DataFrame(tableNew,columns=newHeaders)
print dfNew
输出:
year value
0 2005 3
1 2010 18