Объединение двух pandas фреймов данных с двухчленным индексом возвращает неуникальные ключи - PullRequest
0 голосов
/ 01 апреля 2020

РЕДАКТИРОВАТЬ

Я написал это сообщение, думая, что проблема была в merge() или join(), однако проблема была в результатах, полученных из groupby(). Если вы нашли этот пост, есть изменение, что вы получаете ту же ошибку по той же причине. Поэтому я оставил заголовок без изменений.

Исходное сообщение

У меня есть два pandas кадра данных, каждый из которых содержит три столбца. Типы:

A: category
B: uint32
C: uint32

Я группирую их по первым двум столбцам и применяю функцию, например так:

df1 = df1.groupby(["A", "B"]).apply(my_function, meta={"Res_1":"uint32", "Res_2":"float32", "Res_3":"float32"})
df2 = df2.groupby(["A", "B"]).apply(my_function, meta={"Res_1":"uint32", "Res_2":"float32", "Res_3":"float32"})

Полученные два кадра данных имеют три столбца и составлен индекс двух слагаемых (первоначально столбцы A и B). Они выглядят так:

                          Res_1       Res_2       Res_3
A        B                                   
chrA01   1                    0    0.000000    0.000000
         5001                 0    0.000000    0.000000
         35001             2656    0.967225   21.346008
         55001              261    1.000000   27.003832
chrC01   1                  131    0.411950    8.610687
...                         ...         ...         ...
         10001                0    0.000000    0.000000
chrA01   30001             1511    1.000000   25.416943
         90001             1407    1.000000   25.073915
chrC01   30001                0    0.000000    0.000000
         90001                0    0.000000    0.000000

Затем я хочу объединить их в один фрейм данных, используя объединение индексов df1 и df2, поэтому я использую опцию how="outer" on=["A", "B"].

df = pd.merge(df1, df2, how="outer", on=["A", "B"], validate="one_to_one")

Тем не менее, я получаю эту ошибку, так как я делаю validate="one_to_one":

pandas.errors.MergeError: Merge keys are not unique in either left or right dataset; not a one-to-one merge

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

Может, я неправильно делаю merge()? Мой подозреваемый находится в пути, когда я указываю опцию on=.... Можно ли указать on=index, даже если это индекс с двумя терминами?

1 Ответ

0 голосов
/ 01 апреля 2020

После предложений по просмотру индексов и уникальных индексов я обнаружил проблему. При выполнении groupby() для A и B функция, вызванная с помощью apply(), вернула одну строку с правильными результатами и одну строку, полную NaN значений. Причина еще не определена.

Из-за странной сортировки выходных данных эти два выходных сигнала не были один за другим в кадрах данных. Следовательно, я не видел вторых NaN строк при написании этого поста.

После генерации кадров данных я теперь запускаю df.dropna(how="all") для каждого, и дублированные индексы исчезают. Я чувствую, что это не чистое решение, так как эти строки NaN вообще не должны присутствовать, но сейчас я нашел этот патч.

...