我有以下两个熊猫数据框:
df1
A B C
0 1 2 1
1 7 3 6
2 3 10 11
df2
A B C
0 2 0 2
1 8 4 7
其中A,B和C是两个数据框的列标题。
我正在尝试将df1
的列与df2
的列进行比较,以使df2
中的第一行是下界,第二行是上界。 df1
中上下限之外(列方式)的所有值都需要替换为NaN
。
因此在此示例中,输出应为:
A B C
0 nan 2 nan
1 7 3 6
2 3 nan nan
作为一个基本的我正在尝试df1[df1 < df2] = np.nan
,但这是行不通的。我也尝试过.where()
,但没有成功。
在此感谢您的帮助,谢谢。
答案 0 :(得分:2)
IIUC
df=df1.where(df1.ge(df2.iloc[0])&df1.lt(df2.iloc[1]))
A B C
0 NaN 2.0 NaN
1 7.0 3.0 6.0
2 3.0 NaN NaN
答案 1 :(得分:2)
您可以执行以下操作:
lower = df1 < df2.iloc[0, :]
upper = df1 > df2.iloc[1, :]
df1[lower | upper] = np.nan
print(df1)
输出
A B C
0 NaN 2.0 NaN
1 7.0 3.0 6.0
2 3.0 NaN NaN
答案 2 :(得分:1)
这里是一个df.clip
和mask
的人:
df1.mask(df1.ne(df1.clip(lower = df2.loc[0],upper = df1.loc[1],axis=1)))
A B C
0 NaN 2.0 NaN
1 7.0 3.0 6.0
2 3.0 NaN NaN
答案 3 :(得分:1)
使用between
的方法稍有不同,
df1.apply(lambda x:x.where(x.between(*df2.values, False)), axis=1)