Объедините панд df с how = внутренними и неуникальными предметами - PullRequest
0 голосов
/ 01 июля 2018

У меня есть два кадра данных, которые выглядят так:

df1

     a     b     c
0  foo  None   qux
1  foo   bar  None
2  foo  None  None
3  foo  None   qux
4  foo  None  None

df2

     a     b     c
0  foo  None   qux
1  foo  None   qux
2  foo   bar   qux
3  foo   bar  None
4  foo   bar  None

Я думал, что делает

pd.merge(df1, df2, on=df1.columns.tolist(), how='inner')

вернется

     a     b     c
0  foo  None   qux
1  foo  None   qux
2  foo   bar  None

и вместо этого получил это:

     a     b     c
0  foo  None   qux
1  foo  None   qux
2  foo  None   qux
3  foo  None   qux
4  foo   bar  None
5  foo   bar  None

Могу ли я объединить df1 и df2, чтобы найти только пересечение этих двух? Как? Я не понимаю, как внутреннее объединение возвращает больше элементов, чем в отдельном df.

1 Ответ

0 голосов
/ 01 июля 2018

Слияние не знает, как различать эти идентичные строки, поэтому они дублируются больше раз, чем необходимо.

Я бы предложил использовать временный столбец для записи cumcount, выполнить merge -ing, а затем удалить временный столбец.

df1['d'] = df1.groupby(df1.columns.tolist()).cumcount()
df2['d'] = df2.groupby(df2.columns.tolist()).cumcount()

df1.merge(df2, how='inner').drop('d', 1)

     a     b     c
0  foo  None   qux
1  foo   bar  None
2  foo  None   qux

Это работает, потому что df1 и df2 теперь имеют 4-й столбец индикатора для различения дубликатов:

print(df1)
     a     b     c  d
0  foo  None   qux  0
1  foo   bar  None  0
2  foo  None  None  0
3  foo  None   qux  1
4  foo  None  None  1

print(df2)
     a     b     c  d
0  foo  None   qux  0
1  foo  None   qux  1
2  foo   bar   qux  0
3  foo   bar  None  0
4  foo   bar  None  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...