Сравните два pandas кадра данных и замените значение на основе условия - PullRequest
1 голос
/ 28 марта 2020

У меня есть два следующих pandas фрейма данных:

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

As основы c Я пытаюсь df1[df1 < df2] = np.nan, но это не работает. Я также попробовал .where(), но не добился успеха.

Буду признателен за помощь здесь, спасибо.

Ответы [ 4 ]

2 голосов
/ 28 марта 2020

Вы можете сделать что-то вроде:

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 голосов
/ 28 марта 2020

IIU C

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 голос
/ 28 марта 2020

Немного другой подход с использованием between,

df1.apply(lambda x:x.where(x.between(*df2.values, False)), axis=1)
1 голос
/ 28 марта 2020

Вот один с 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
...