Як поєднати два кадри даних?


105

Я використовую кадри даних 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.

Відповіді:


148

Я вважаю, що ви можете використовувати 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.