【问题标题】:Iterrows a rolling sumIterrows 滚动总和
【发布时间】:2013-08-13 06:22:27
【问题描述】:

我有一个 pandas 数据框

from pandas import DataFrame, Series

其中每一行对应一个案例,每一列对应一个月。我想在每 12 个月期间执行滚动总和。看起来很简单,但我被卡住了

result = [x for x.rolling_sum(12) in df.iterrows()]
result = [x for x.rolling_sum(12) in df.T.iteritems()]    

语法错误:无法分配给函数调用

a = []
for x in df.iterrows():
    s = x.rolling_sum(12)
    a.append(s)

AttributeError: 'tuple' 对象没有属性 'rolling_sum'

【问题讨论】:

  • rolling_sum 定义在哪里?
  • @PaulMcGuire rolling_sum 是pandas.Series 的一个方法。我将编辑代码以包含对它的显式引用。
  • 你应该写 for i,x in df.iterrows(): 来制作 x 一个系列。

标签: python pandas dataframe


【解决方案1】:

我想也许你正在寻找的是

pd.rolling_sum(df, 12, axis=1)

在这种情况下,不需要列表推导。 axis=1 参数使 Pandas 计算 df 的滚动总和。

例如,

import numpy as np
import pandas as pd
ncols, nrows = 13, 2
df = pd.DataFrame(np.arange(ncols*nrows).reshape(nrows, ncols))
print(df)
#    0   1   2   3   4   5   6   7   8   9   10  11  12
# 0   0   1   2   3   4   5   6   7   8   9  10  11  12
# 1  13  14  15  16  17  18  19  20  21  22  23  24  25

print(pd.rolling_sum(df, 12, axis=1))

打印

   0   1   2   3   4   5   6   7   8   9   10   11   12
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN   66   78
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN  222  234

关于您的列表理解:

您的列表理解部分的顺序错误。试试:

result = [expression for x in df.iterrows()]

有关列表推导的更多信息,请参阅 the docs

列表推导的基本形式是

[expression for variable in sequence]

Python 执行后得到的列表等价于result

result = []
for variable in sequence:
    result.append(expression)

请参阅this link 了解列表解析的完整语法。

【讨论】:

  • 解决了第一个问题,下一个问题是 iterrows() 产生元组和 iteritems() 产生键值对,rolling_sum 方法都没有。
  • 谢谢。对于[x.rolling_sum(12) for x in df.iterrows()],我得到AttributeError: 'tuple' object has no attribute 'rolling_sum'
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 2019-04-11
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多