总计5年跨度的数据

时间:2017-11-23 18:45:47

标签: python python-3.x pandas

考虑以下数据:

  date  |  value  
--------+--------
 2004   |   1
 2005   |   2
 2006   |   3
 2007   |   4
 2008   |   5
 2009   |   6

我需要对5年期间的值求和,因此数据看起来像这样:

  date  |  value  
--------+--------
 2005   |   3
 2010   |  18

我怎样才能做到这一点?我是一个初学者,所以我甚至都不知道从哪里开始。

4 个答案:

答案 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