Это баг или я чего то не понимаю? - PullRequest
5 голосов
/ 18 апреля 2020

Я хотел объединить два набора данных по их значению ключа и получил странные результаты. Я сделал простую версию для воспроизведения этой проблемы.

df    = pd.DataFrame({'key':[1, 2, 3]})
other = pd.DataFrame({'key':[1, 2, 3]})

df.join(
    other,
    on='key',
    lsuffix='_caller'
)

Я получил такой вывод:

    key_caller  key
0   1           2.0
1   2           3.0
2   3           NaN

Я подумал, что это странно, поэтому я решил попробовать эту:

df    = pd.DataFrame({'key':[i for i in range(3)]})
other = pd.DataFrame({'key':[i for i in range(3)]})

df.join(
    other,
    on='key',
    lsuffix='_caller'
)

И получил ожидаемый результат:

    key_caller  key
0   0           0
1   1           1
2   2           2

Если нет нуля, то соединение испорчено, но если есть ноль, все работает отлично.

Так Может кто-нибудь объяснить, что происходит?

Ответы [ 2 ]

5 голосов
/ 18 апреля 2020

Значения двух примеров различны. В первом они равны 1, 2 и 3. Во втором примере они равны 0, 1, 2.

join использует имя столбца в левом кадре данных и индекс справа. Во втором примере, поскольку вы использовали range, индекс правого фрейма данных идентичен значениям ключа в левом фрейме данных, поэтому соответствие идеально. В первом примере нет индекса для 3, поэтому вы получаете NaN, что приводит к преобразованию значений в число с плавающей запятой.

3 голосов
/ 18 апреля 2020

Ваша проблема в том, что объединение объединить ваши df от df.index с other.index, если вы передаете параметр используется только для других, вы делаете df.index == other['key']

Используйте слияние, чтобы указать столбцы в оба df:

pd.merge(df,
     other.rename(columns={'key': 'key_caller'}),
     left_on='key',
     right_on='key_caller'
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...