сравнивая каждое значение в двух столбцах - PullRequest
0 голосов
/ 03 июня 2019

Как я могу сравнить два столбца в кадре данных и создать новый столбец на основе разницы этих двух столбцов эффективно?

У меня есть функция в моей таблице, в которой много пропущенных значений, и мне нужно заполнить эту информацию, используя другие таблицы в базе данных, которые содержат эту же функцию. Я использовал np.select для сравнения функции в моей исходной таблице с той же функцией в другой таблице, но я чувствую, что должен быть простой метод.

Например: pd.DataFrame({'A': [1,2,3,4,np.nan], 'B':[1,np.nan,30,4,np.nan]})

Я ожидаю, что новый столбец будет содержать значения [1,2,"different",4,np.nan]. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Другой способ - использовать pd.DataFrame.iterrows с nunique:

import pandas as pd

df['C'] = [s['A'] if s.nunique()<=1 else 'different' for _, s in df.iterrows()]

Вывод:

     A     B          C
0  1.0   1.0          1
1  2.0   NaN          2
2  3.0  30.0  different
3  4.0   4.0          4
4  NaN   NaN        NaN
0 голосов
/ 03 июня 2019

pandas.Series.combine_first или pandas.DataFrame.combine_first могут быть полезны здесь. Они работают как SQL COALESCE и объединяют два столбца, выбирая первое ненулевое значение, если оно существует.

df = pd.DataFrame({'A': [1,2,3,4,np.nan], 'B':[1,np.nan,30,4,np.nan]})
C = df.A.combine_first(df.B)

C выглядит так:

0    1.0
1    2.0
2    3.0
3    4.0
4    NaN

Затем, чтобы отразить ваше требование о том, что два разных ненулевых значения должны давать «разные» при объединении, просто найдите эти индексы и обновите значения.

mask = ~df.A.isna() & ~df.B.isna() & (df.A != df.B)
C[mask] = 'different'

C теперь выглядит так:

0            1
1            2
2    different
3            4
4          NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...