Как сравнить значения столбцов панд между двумя фреймами данных - PullRequest
0 голосов
/ 17 ноября 2018

Я просто пытаюсь понять, чтобы получить значения One DataFrame на основе определенного столбца, т.е. в этом случае столбец IDs, который присутствует в обоих DataFrames, я с нетерпением жду, чтобы сопоставить значения, основанные на df1 s column IDs с df2 s column IDs Таким образом, если значения df1.Keywords в df2.Name, но df2.Name, имеющий более одного значения, которое будет здесь значительным, выводит логические значения True или False на основе этого.

Примечание: df1.Keywords isin df2.Name на основе IDs на стенде DataFrames.

DataFrame First df1

>>> df1
    IDs    Keywords
0  1234       APPLE
1  1234      ORANGE
2  1234      LEMONS
3  5346      ORANGE
4  5346  STRAWBERRY
5  5346   BLUEBERRY
6  8793         TEA

Второй кадр данных df2

>>> df2
    IDs              Name
0  1234        APPLE ABCD
1  5346        APPLE ABCD
2  1234    STRAWBERRY YES
3  8793  ORANGE AVAILABLE
4  8793     TEA AVAILABLE

Ожидаемый:

IDs    Name               New_Bools
1234   APPLE ABCD ONE     True
5346   APPLE ABCD         False
1234   STRAWBERRY YES     False
8793   ORANGE AVAILABLE   False
8793   TEA AVAILABLE      False
8793   TEA COFFEE         True

Я попытался создать MultiIndex с isin, но не работает.

index1 = pd.MultiIndex.from_arrays([df1[col] for col in ['IDs', 'Keywords']])
index2 = pd.MultiIndex.from_arrays([df2[col] for col in ['IDs', 'Name']])

df1.IDs.isin(df2.IDs)

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Используйте merge, чтобы связать Keywords с Name через IDs, после того, как вы groupby IDs и Name, apply lambda, чтобы вычислить любое имя contains ключевые слова в своей группе:

df.merge(df2).groupby(['IDs','Name']).apply(lambda x: any(x['Name'].str.contains('|'.join(x['Keywords'])))).rename('flag').reset_index()

    IDs     Name              flag
0   1234    APPLE ABCD        True
1   1234    STRAWBERRY YES    False
2   5346    APPLE ABCD        False
3   8793    ORANGE AVAILABLE  False
4   8793    TEA AVAILABLE     True
0 голосов
/ 17 ноября 2018

Если вам нужно создать логическое значение, основанное только на одном значении ...

В зависимости от того, что вы пытаетесь сопоставить (что выглядит как только Id из вашего вопроса) Предполагая, что вас это не волнуетсопоставляя ваши Name и Keyword столбцы, затем используйте isin, и что-то вроде приведенного ниже должно дать вам ваш логический флаг.

import pandas as pd

data = {'Id': [1, 2, 3, 1, 2, 3, 1, 2], 'Val': ['ABC', 'BCD', 'CDE', 'DEF', 'EFG', 'HIJ', 'IJK', 'JKL']}
data2 = {'Id': [1, 4, 7, 1, 2, 0, 1, 5], 'Val': ['ABC pld', 'BCD iod', 'CDE jkdf', 'DEF uyt', 'EFG erf', 'HIJ dfd', 'IJK mnb', 'JKL jkdf']}


df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)

df['New_Bools'] = df['Id'].isin(df2['Id'])
print(df)

Outputs

   Id  Val       Id_In_DF2
0   1  ABC       True
1   2  BCD       True
2   3  CDE      False
3   1  DEF       True
4   2  EFG       True
5   3  HIJ      False
6   1  IJK       True
7   2  JKL       True

Если вам нужно сопоставить несколько столбцов и значений ...

Если вам нужно сопоставить имена (ожидаемый результат), вам потребуется выполнить дополнительные манипуляции со строками, чтобы изолироватьфрукты в дф2.Продолжая использовать данные в моем примере, вы сможете изолировать свои фрукты, используя apply, lambda и split в ваших строках.Индекс 0 даст вам свои плоды.

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

# string manipulation for df2
df2['Name'] = df2['Val'].apply(lambda x: x.split(' ')[0])

# perform your eval like this:
df['New_Bools_Id_And_Name'] = ((df['Id'] == df2['Id']) & (df['Val'] == df2['Name']))

Какие выходы

    Id  Val  New_Bools  New_Bools_Id_And_Name
0   1  ABC       True                   True
1   2  BCD       True                  False
2   3  CDE      False                  False
3   1  DEF       True                   True
4   2  EFG       True                   True
5   3  HIJ      False                  False
6   1  IJK       True                   True
7   2  JKL       True                  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...