Python pandas:将函数应用于数据帧.滚动()

2024-04-20 11:42:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据帧:

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的大小应与其中的真或假大小相同:

^{pr2}$
  • iloc[0,1]是NaN BAC,因为在那个单元中,只给出了两个数字,但至少需要3个数字来进行测试。在
  • df1.iloc[1,3]为False,因为[7,8,9]中没有一个大于10
  • df1.iloc[3,4]为真,因为[18,19,20]中的2或更多大于10

我想数据帧.滚动.应用()使用函数可能是解决方案,但具体如何解决呢?在


Tags: 数据in标记truedataframedf标准数字
3条回答

在布尔数据帧上使用sum。在

df.gt(10).rolling(3, axis=1).sum().ge(2)

       0      1      2      3      4
0  False  False  False  False  False
1  False  False  False  False  False
2  False  False   True   True   True
3  False  False   True   True   True
4  False  False   True   True   True

您可以通过屏蔽na的位置来确定确切的请求输出。在

^{pr2}$

你需要-

import pandas as pd
import numpy as np
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]])
df1 = df.apply(lambda x: pd.Series([np.nan, np.nan]+[all(j>10 for j in i) for i in zip(x[0::1], x[1::1], x[2::1])]), axis=1)

print(df1)

输出

^{pr2}$

说明

list(zip(x[0::1], x[1::1], x[2::1])

将其分解为每行一次取3列-

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

all(j>10 for j in i)

检查元组列表中的每个元素,如果元组中的所有元素都大于10,则输出True

连接[np.nan, np.nan]以匹配输出。希望有帮助。在

使用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]])

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

^{pr2}$

我把门槛硬编码为10。因此,如果在任何窗口中大于10的值的数目大于或等于2,则最后一个值将被1(表示真),否则它将被-1(表示假)替换。在

如果您想将threshold参数保留为变量,那么请查看this答案以将它们作为参数传递。在

现在在滚动窗口上应用这个函数,使用窗口大小为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

相关问题 更多 >