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

标签 python pandas

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

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,因此您无权访问任何其他列不幸的是。

但是你可以做的是使用一些 bool 逻辑根据 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 的变量类型

了解实际传递给 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'>

关于python - 如何获取滚动 Pandas 数据框子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41701246/

相关文章:

python - 将多分隔符列拆分为多列

python - Tensorflowpartial_run() "Must run ' setup’在执行部分运行之前!”尽管已经设置

python - 为使用 urllib.urlretrieve 下载的文件添加时间戳

python - 使用 CSV 文件的 Matplotlib 多线图

python - pandas 中的排名数字

Pandas - 两个不同数据框中特定列的通用值

python - M2Crypto 包的使用

python - 如何使用 peewee 查询获取列/字段?

pandas - 将索引和列值作为输入对 pandas 数据框应用逐元素函数

python - 来自字典的DataFrame