Как объединить два фрейма данных?

107

Я использую фреймы данных Pandas. Скажем, у меня есть исходный фрейм данных D. Я извлекаю из него два фрейма данных следующим образом:

A = D[D.label == k]
B = D[D.label != k]

затем я меняю метку AиB

A.label = 1
B.label = -1

Я хочу объединить A и B, чтобы иметь их как один фрейм данных, что-то вроде операции объединения. Порядок данных не важен. Однако, когда мы выбираем A и B из D, они сохраняют свои индексы из D.

MKoosej
источник

Ответы:

153

Я считаю, что вы можете использовать appendметод

bigdata = data1.append(data2, ignore_index=True)

чтобы сохранить свои индексы, просто не используйте ignore_indexключевое слово ...

Джоран Бизли
источник
1
Это работает. Однако он создает новый DataFrame. Есть ли способ сделать это встроенным? Это было бы хорошо, когда я загружаю огромные объемы данных из базы данных партиями, чтобы я мог итеративно обновлять DataFrame, не создавая каждый раз копию.
Эндрю
1
Да, это возможно, см .: stackoverflow.com/a/46661368/5717580
martin-martin
91

Вы также можете использовать pd.concat, что особенно полезно, когда вы объединяете более двух фреймов данных:

bigdata = pd.concat([data1, data2], ignore_index=True, sort=False)
острокач
источник
Я хочу использовать это, но я пытаюсь объединить два столбца с одинаковым именем o_O
lifelonglearner
45

Подумал добавить это сюда на случай, если кто-то сочтет это полезным. @ostrokach уже упоминал, как вы можете объединить фреймы данных по строкам, что

df_row_merged = pd.concat([df_a, df_b], ignore_index=True)

Чтобы объединить столбцы, вы можете использовать следующий синтаксис:

df_col_merged = pd.concat([df_a, df_b], axis=1)
пелуми
источник
14

Есть еще одно решение для случая, когда вы работаете с большими данными и вам нужно объединить несколько наборов данных. concatможет стать требовательным к производительности, поэтому, если вы не хотите каждый раз создавать новый df, вы можете вместо этого использовать понимание списка :

frames = [ process_file(f) for f in dataset_files ]
result = pd.append(frames)

(как указано здесь, в документации внизу раздела):

Примечание . Однако стоит отметить, что concat(и, следовательно append) создается полная копия данных, и что постоянное повторное использование этой функции может значительно снизить производительность. Если вам нужно использовать операцию с несколькими наборами данных, используйте составление списка.

Мартин-Мартин
источник
2

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

Шаг 1. Установите индекс первого кадра данных (df1)

df1.set_index('id')

Шаг 2: Установите индекс второго фрейма данных (df2)

df2.set_index('id')

и, наконец, обновите фрейм данных, используя следующий фрагмент -

df1.update(df2)
Мохсин Махмуд
источник
0

1-й кадр данных

train.shape

результат: -

(31962, 3)

2-й фрейм данных

test.shape

результат: -

(17197, 2)

Объединить

new_data=train.append(test,ignore_index=True)

Проверьте

new_data.shape

результат: -

(49159, 3)
Хариш Кумават
источник