gpt4 book ai didi

Python Pandas : apply a function to dataframe. 滚动()

转载 作者:行者123 更新时间:2023-11-28 22:19:18 25 4
gpt4 key购买 nike

我有这个数据框:

In[1]df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]])
In[2]df
Out[2]:
0 1 2 3 4
0 1 2 3 4 5
1 6 7 8 9 10
2 11 12 13 14 15
3 16 17 18 19 20
4 21 22 23 24 25

我需要实现这个:

  1. 对于我数据框中的每一行,
  2. 如果任意 3 个连续单元格中有 2 个或更多值大于 10,
  3. 然后应将这 3 个单元格中的最后一个标记为 True。

根据上述标准,结果数据帧 df1 的大小应与其中的 True 或 False 相同:

In[3]df1
Out[3]:
0 1 2 3 4
0 NaN NaN False False False
1 NaN NaN False False False
2 NaN NaN True True True
3 NaN NaN True True True
4 NaN NaN True True True
  • df1.iloc[0,1] 是 NaN 因为在该单元格中,只给出了两个数字,但至少需要 3 个数字才能进行测试。
  • df1.iloc[1,3] 为假,因为 [7,8,9] 中没有一个大于 10
  • df1.iloc[3,4] 为真,因为 [18,19,20] 中的 2 或更多大于 10

我认为带有函数的 dataframe.rolling.apply() 可能是解决方案,但究竟如何呢?

最佳答案

您说得对,使用 rolling() 是可行的方法。但是,您必须牢记,因为 rolling() 会将窗口末尾的值替换为新值,因此您不能仅将窗口标记为 True当条件不适用时也会得到 False

以下是使用示例数据框并执行所需转换的代码:

df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]])

现在,定义一个以窗口为参数并返回是否满足条件的函数

def fun(x):
num = 0
for i in x:
num += 1 if i > 10 else 0
return 1 if num >= 2 else -1

我已将阈值硬编码为 10。因此,如果在任何窗口中大于 10 的值的数量大于或等于 2,那么最后一个值将替换为 1(表示 True),否则将替换为 -1 (表示错误)。

如果您想将阈值参数保留为变量,请查看 this answer 将它们作为参数传递。

现在在滚动窗口上应用该函数,窗口大小为 3,轴为 1,此外,如果您不想要 NaN,则还可以在参数中将 min_periods 设置为 1。

df.rolling(3, axis=1).apply(fun)

产生输出为

  0   1    2    3    4
0 NaN NaN -1.0 -1.0 -1.0
1 NaN NaN -1.0 -1.0 -1.0
2 NaN NaN 1.0 1.0 1.0
3 NaN NaN 1.0 1.0 1.0
4 NaN NaN 1.0 1.0 1.0

关于Python Pandas : apply a function to dataframe. 滚动(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49838315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com