【问题标题】:find running total on every 7th day in pandas在 pandas 中每 7 天查找一次运行总数
【发布时间】:2019-01-26 08:11:37
【问题描述】:

我有这样的数据。第一列是从一个起点开始的天数。第二列是在给定的每个天数后生成的值。 例如,第 1 天后我得到 5 美元,第 2 天后我得到 3 美元,依此类推。可能有一段时间没有收入,比如第 4 天。数字不连续。

data =pd.DataFrame({'day':[1,2,3,5,6,7,8,9,10,11,14,15,17,18,19],
                   'value':[5,3,7,8,9,4,6,5,2,8,6,7,9,5,2]})

我想在每 7 天窗口后查找总值。 输出应该像

day    value
7       36
14      27
21      23

我正在使用循环来实现这一点。有没有更好的pythonic方式来做到这一点。

df =pd.DataFrame({})
sum_value=0
for index, row in data.iterrows():
    sum_value+= row['value']
    if row['day'] %7==0:
        df = df.append(pd.DataFrame({'day':row['day'],'sum_value':[sum_value]}))
        sum_value=0
pritn(df)

另外,如何在每一天(每行)查找前 7 天值的总和 预期输出

day   value
1      5
2      8
3      15
5      23
6      32
7      36
8      37
9      39
10     34
and so on...

我希望我的计算是正确的。它基本上是前 7 天的总价值。如果天数列中没有缺少数字会更容易。

【问题讨论】:

  • 请检查已编辑的答案。

标签: python-3.x pandas


【解决方案1】:

groupby 与辅助函数Series 与减1 和整数除法与聚合sumlast 一起使用:

df = data.groupby((data['day'] - 1) // 7 , as_index=False).agg({'day':'last', 'value':'sum'})
print (df)

   day  value
0    7     36
1   14     27
2   19     23

详情

print ((data['day'] - 1) // 7)

0     0
1     0
2     0
3     0
4     0
5     0
6     1
7     1
8     1
9     1
10    1
11    2
12    2
13    2
14    2
Name: day, dtype: int64

如果需要,类似的解决方案将day 列除以7

df = data.groupby((data['day'] - 1) // 7)['value'].sum().reset_index()
df['day'] = (df['day'] + 1) * 7
print (df)

   day  value
0    7     36
1   14     27
2   21     23

编辑:需要rollingsum,但首先需要通过reindex 添加缺少的dates - day 列的必要唯一值。

idx = np.arange(data['day'].min(), data['day'].max() + 1)
df = data.set_index('day').reindex(idx).rolling(7, min_periods=1).sum()
df = df[df.index.isin(data['day'])]
print (df)
     value
day       
1      5.0
2      8.0
3     15.0
5     23.0
6     32.0
7     36.0
8     37.0
9     39.0
10    34.0
11    42.0
14    27.0
15    28.0
17    30.0
18    27.0
19    29.0

如果得到:

ValueError: 无法从重复的轴重新索引

这意味着重复 day 值并且解决方案首先聚合 sum

#duplicated day 1
data =pd.DataFrame({'day':[1,1,3,5,6,7,8,9,10,11,14,15,17,18,19],
                   'value':[5,3,7,8,9,4,6,5,2,8,6,7,9,5,2]})


idx = np.arange(data['day'].min(), data['day'].max() + 1)
df = data.groupby('day')['value'].sum().reindex(idx).rolling(7, min_periods=1).sum()
df = df[df.index.isin(data['day'])]
print (df)
day
1      8.0
3     15.0
5     23.0
6     32.0
7     36.0
8     34.0
9     39.0
10    34.0
11    42.0
14    27.0
15    28.0
17    30.0
18    27.0
19    29.0
Name: value, dtype: float64

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2019-12-17
    • 1970-01-01
    • 2021-08-07
    • 2010-09-21
    • 2017-11-06
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多