Python 如何创建一个新的布尔列来处理前n行中的信息
给定一个dataframe df,我想基于前n行(例如前3行)中的值为每一行生成一个新变量/列 例如,考虑到以下情况: 输入 D的计算:如果在C中的实际行或C中的前3行中有2个或更多单元格>70,则为1,否则为0 输出Python 如何创建一个新的布尔列来处理前n行中的信息,python,pandas,Python,Pandas,给定一个dataframe df,我想基于前n行(例如前3行)中的值为每一行生成一个新变量/列 例如,考虑到以下情况: 输入 D的计算:如果在C中的实际行或C中的前3行中有2个或更多单元格>70,则为1,否则为0 输出 A B C D 10 2 59.4 0 53 3 71.5 0 32 2 70.4 1 24 3 82.1 1 我应该如何在pandas中实现它?IIUC,应该使用滚动并在应用程序中构建您的逻辑 您还可以填充NA以将NaN转换为0 我认为@
A B C D
10 2 59.4 0
53 3 71.5 0
32 2 70.4 1
24 3 82.1 1
我应该如何在pandas中实现它?IIUC,应该使用滚动并在应用程序中构建您的逻辑
您还可以填充NA以将NaN转换为0
我认为@RafaelC的答案是正确的。我添加了一个答案,以提供更好的示例数据,涵盖边缘情况,并稍微调整@RafaelC的语法。特别是: min_periods=1允许索引值小于窗口的早期行为非NaN 窗口=4允许考虑当前条目加上前3个条目 使用sum而不是size仅获取真值 更新代码:
window = 4
df.C.rolling(window, min_periods=1).apply(lambda x: (x>70).sum()>=2)
数据:
根据OP规则的预期输出:
0 0.0
1 0.0
2 1.0
3 1.0
4 1.0
5 1.0
6 0.0
7 0.0
8 0.0
9 1.0
Name: C, dtype: float64
不,因为在第三行中,71.5和70.4符合条件。如果在OP的原始数据之后再添加一些示例案例,则不确定这是否有效-尝试向C添加4个小于70的值。window=4如何;df.rollingwindow,最小周期=1.applylambda x:x>70。总和>=2?这似乎可以正确处理边缘情况。
.fillna(0)
0 0.0
1 0.0
2 1.0
3 1.0
window = 4
df.C.rolling(window, min_periods=1).apply(lambda x: (x>70).sum()>=2)
A B C
10 2 59.4
53 3 71.5
32 2 70.4
24 3 82.1
11 4 10.1
10 5 1.0
12 3 2.3
13 2 1.1
99 9 70.2
12 9 80.0
0 0.0
1 0.0
2 1.0
3 1.0
4 1.0
5 1.0
6 0.0
7 0.0
8 0.0
9 1.0
Name: C, dtype: float64