python-如何获取滚动熊猫数据框子集

我想以“滚动”方式获取数据框子集.
我尝试了几项都没有成功,这是我想做的一个例子.让我们考虑数据帧.

df
     var1      var2
0    43         74
1    44         74
2    45         66
3    46        268
4    47         66

我想用执行条件总和的以下函数创建一个新列:

def func(x):
    tmp = (x["var1"] * (x["var2"] == 74)).sum()
    return tmp

并这样称呼它

df["newvar"] = df.rolling(2, min_periods=1).apply(func)

这意味着该函数将基于数据帧应用,而不是针对每一行或每一列

它会回来

     var1      var2      newvar
0    43         74         43          # 43
1    44         74         87          # 43 * 1 + 44 * 1
2    45         66         44          # 44 * 1 + 45 * 0
3    46        268         0           # 45 * 0 + 46 * 0
4    47         66         0           # 46 * 0 + 47 * 0

有pythonic的方法可以做到这一点吗?
这只是一个示例,但条件(始终基于子数据帧值取决于多于2列.

解决方法:

更新的评论

@unutbu对a very similar question here发布了一个很好的答案,但看来他的答案是基于pd.rolling_apply的,该索引将索引传递给函数.我不确定如何使用当前的DataFrame.rolling.apply方法复制它.

原始答案

似乎通过apply函数传递给参数的变量是每列的numpy数组(一次一个),而不是DataFrame,因此很遗憾,您无法访问任何其他列.

但是您可以做的是使用一些布尔逻辑,根据var2是否为74临时创建一个新列,然后使用滚动方法.

df['new_var'] = df.var2.eq(74).mul(df.var1).rolling(2, min_periods=1).sum()

   var1  var2  new_var
0    43    74     43.0
1    44    74     87.0
2    45    66     44.0
3    46   268      0.0
4    47    66      0.0

临时列基于上面代码的前半部分.

df.var2.eq(74).mul(df.var1)
# or equivalently with operators
# (df['var2'] == 74) * df['var1']

0    43
1    44
2     0
3     0
4     0

查找传递给应用的变量的类型

了解实际传递给apply函数内容非常重要,我永远无法记住传递的内容,因此,如果我不确定我会打印出变量及其类型,以便我可以清楚地知道我是哪个对象正在处理.请参阅带有原始DataFrame的此示例.

def foo(x):
    print(x)
    print(type(x))
    return x.sum()

df.rolling(2, min_periods=1).apply(foo)

输出

[ 43.]
<class 'numpy.ndarray'>
[ 43.  44.]
<class 'numpy.ndarray'>
[ 44.  45.]
<class 'numpy.ndarray'>
[ 45.  46.]
<class 'numpy.ndarray'>
[ 46.  47.]
<class 'numpy.ndarray'>
[ 74.]
<class 'numpy.ndarray'>
[ 74.  74.]
<class 'numpy.ndarray'>
[ 74.  66.]
<class 'numpy.ndarray'>
[  66.  268.]
<class 'numpy.ndarray'>
[ 268.   66.]
<class 'numpy.ndarray'>

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...