给定一个数据帧df,我想基于前n行(例如前3行)中的值为每行生成一个新的变量/列。
例如,给出以下内容:
输入
A B C
10 2 59.4
53 3 71.5
32 2 70.4
24 3 82.1
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
我该怎么做在大熊猫中?
答案 0 :(得分:1)
IIUC,应使用rolling
,并在apply
window = 3
df.C.rolling(window).apply(lambda s: 1 if (s>=70).size >= 2 else 0)
0 NaN
1 NaN
2 1.0
3 1.0
您还可以fillna
将NaN
变成0
.fillna(0)
0 0.0
1 0.0
2 1.0
3 1.0
答案 1 :(得分:0)
我认为@RafaelC的答案是正确的方法。我为(a)提供涵盖边缘情况的更好示例数据以及(b)略微调整@RafaelC的语法提供了一个答案。特别是:
min_periods = 1
允许索引值小于窗口的早期行为非NaN
window = 4
允许考虑当前条目以及前三个条目sum()
代替size
仅获得True
值更新的代码:
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
根据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