这是我的数据框。
import pandas as pd
df = pd.DataFrame(
{
'a': [100, 1123, 9999, 100, 1, 954, 1],
'b': [1000, 11123, 1123, 0, 55, 0, 1],
},
)
预期输出正在创建列c
:
a b c
0 100 1000 NaN
1 1123 11123 NaN
2 9999 1123 9999.0
3 100 0 NaN
4 1 55 NaN
5 954 0 NaN
6 1 1 NaN
面具是:
mask = ((df.a > df.b))
我想获得满足此掩码条件的第一行(如果它位于前 3 行)并放入df.a
create c
。对于此示例,此代码有效:
df.loc[mask.cumsum().eq(1) & mask, 'c'] = df.a
但对于此 DataFrame,它应该返回NaN
for c
,因为 的第一个实例mask
不在前 3 行中。但这不起作用。
df = pd.DataFrame(
{
'a': [0, 0, 0, 0, 0, 954, 1],
'b': [1000, 11123, 1123, 0, 55, 0, 1],
},
)
您可以根据索引向掩码添加条件:
对于第二个示例,这将导致:
如果您希望列的结果
c
与您的问题完全相同,那么您可以使用以下代码:当
df.a[mask]
在最后一行广播时,它将在掩码计算结果为 False 的所有行中放入 NaN。所以,这会导致:无需计算另一个掩码,只需
df['a']
在分配期间进行切片和重新索引:输出: