比较两个熊猫数据框并根据条件替换值

时间:2020-03-28 16:53:14

标签: python pandas numpy dataframe data-analysis

我有以下两个熊猫数据框:

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(),但没有成功。

在此感谢您的帮助,谢谢。

4 个答案:

答案 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.clipmask的人:

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)