сравнить несколько значений столбцов вместе с помощью панд - PullRequest
3 голосов
/ 28 апреля 2019

Я знаю, что могу сделать как ниже , если мы проверяем только два столбца вместе.

df['flag'] = df['a_id'].isin(df['b_id'])

, где df - фрейм данных, а a_id и b_id это два столбца фрейма данных.Он вернет значение True или False в зависимости от совпадения.Но мне нужно сравнить несколько столбцов вместе.

Например: если есть a_id , a_region, a_ip, b_id, b_region and b_ip столбцы.Я хочу сравнить, как показано ниже,

enter image description here

a_key = df['a_id'] + df['a_region] + df['a_ip']
b_key = df['b_id'] + df['b_region] + df['b_ip']

df['flag'] = a_key.isin(b_key)

Каким-то образом приведенный выше код всегда возвращает значение False.Выходные данные должны быть такими, как показано ниже:

enter image description here

Флаг первой строки будет True, потому что есть совпадение.

a_key становится2a10 соответствует последней строке b_key (2a10)

Ответы [ 3 ]

4 голосов
/ 28 апреля 2019

Вы шли в правильном направлении, просто используйте:

a_key = df['a_id'].astype(str) + df['a_region'] + df['a_ip'].astype(str)
b_key = df['b_id'].astype(str) + df['b_region'] + df['b_ip'].astype(str)

a_key.isin(b_key)

Шахта дает следующие результаты:

0     True
1    False
2    False
3 голосов
/ 28 апреля 2019

Вы можете использовать isin с DataFrame в качестве значения, но согласно документам :

Если значения - это DataFrame, то и метки индекса и столбцадолжен соответствовать

Так что это должно работать:

# Removing the prefixes from column names
df_a = df[['a_id', 'a_region', 'a_ip']].rename(columns=lambda x: x[2:])
df_b = df[['b_id', 'b_region', 'b_ip']].rename(columns=lambda x: x[2:])

# Find rows where all values are in the other
matched = df_a.isin(df_b).all(axis=1)

# Get actual rows with boolean indexing
df_a.loc[matched]

# ... or add boolean flag to dataframe
df['flag'] = matched
2 голосов
/ 28 апреля 2019

Вот один из подходов, использующий DataFrame.merge, pandas.concat и тестирование для duplicated значений:

df_merged = df.merge(df,
                     left_on=['a_id', 'a_region', 'a_ip'],
                     right_on=['b_id', 'b_region', 'b_ip'],
                     suffixes=('', '_y'))

df['flag'] = pd.concat([df, df_merged[df.columns]]).duplicated(keep=False)[:len(df)].values

[выход]

    a_id a_region    a_ip     b_id b_region   b_ip   flag
0      2        a      10  3222222    sssss  22222   True
1  22222    bcccc   10000    43333    ddddd  11111  False
2  33333    acccc  120000        2        a     10  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...