Объединение двух таблиц в pandas с предпочтением одной для идентичных индексов - PullRequest
0 голосов
/ 09 апреля 2020

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

df1:

date         value   v2
2020/01/01   df1-1   x
2020/01/03   df1-3   y

df2:

date         value   v2
2020/01/02   df2-2   a
2020/01/03   df2-3   b
2020/01/04   df2-4   c

объединены в

date         value   v2
2020/01/01   df1-1   x
2020/01/02   df2-2   a
2020/01/03   df1-3   y
2020/01/04   df2-4   c

Лучшее, что у меня есть, это

df = df1.merge(df2, how="outer",left_index=True, right_index=True, suffixes=('','_y'))
df['value'] = result_df['value'].combine_first(result_df['value_y'])
df['v2'] = result_df['v2'].combine_first(result_df['v2'])
df=df[['value', 'v2']]

Это выполняет работу, но это кажется излишне неуклюжим. Есть ли более идиоматический c способ добиться этого?

1 Ответ

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

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

Кроме того, Я заметил, что все значения в ваших DataFrames не NaN . Если вы гарантируете это, вы можете выполнить:

df1.set_index('date').combine_first(df2.set_index('date'))\
    .reset_index()

Шаги:

  • combine_first - объединить оба кадра данных на основе значений в их столбцах date .
  • reset_index - заменить столбец date (на данный момент индекс) на «обычный» столбец.

Другой возможный подход

Если оба ваших DataFrames имеют «стандартный» индекс (последовательные числа, начинающиеся с 0 ), и вы хотите сохранить только строки для только этих уникальных индексов, вы можете выполнить:

df = pd.concat([df1, df2]).reset_index().drop_duplicates(subset='index')\
    .set_index('index')
df.index.name = None

Но тогда получается:

        date  value v2
0 2020-01-01  df1-1  x
1 2020-01-03  df1-3  y
2 2020-01-04  df2-4  c

, поэтому отличается от того, что вы представили как , и объединено в (как я предполагаю - ваш ожидаемый результат). На этот раз вы потеряли строку с v2 == 'a' .

Еще один подход

Основан также на предположении, что все значения в ваших DataFrames не NaN :

df1.combine_first(df2)

Результат будет таким же, как и предыдущий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...