Как точно объединить два разных DataFrames с совершенно разными столбцами между ними - PullRequest
1 голос
/ 28 октября 2019

Например, есть два кадра данных, а именно df1 (nx m1) и df2 (nx m2) , между которыми нет общих столбцов. Тогда как объединить кадры данных так, чтобы форма выходного кадра данных была точно nx (m1 + m2) ?

df1 = pd.DataFrame({
    'col_1': [0, 1, 2, 3],
    'col_2': [4, 5, 6, 7]})

df2 = pd.DataFrame({
    'col_3': [6, 4, 3, 1],
    'col_4': [9, 3, 7, 1], 
    'col_5': [19, 13, 17, 10]})

В этом сообществе опубликовано множество решений по следующим вопросам:также решения доступны в Интернете. Тем не менее, ресурсы для сохранения указанных размеров (nx (m1 + m2)) на удивление трудно найти. Для приведенного выше примера или образцов данных небольшого размера, метод слияния ниже работает отлично.

df1. merge(df2, how='inner', left_index= True, right_index= True)

Но метод слияния не работает надлежащим образом на высокоразмерных фреймах данных, имеющих огромные элементы. В случае набора данных о ценах на дома kaggle

https://www.kaggle.com/c/house-prices-advanced-regression-techniques

После разделения числовых и категориальных признаков (фреймов данных) при попытке объединить их с сохранением одинакового размера строки, он становится двойным от суммы строки двух данных (2 * (n + n)) для следующих методов слияния. Есть ли другой способ или подходящий метод, который подходит для выполнения задачи?

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Есть много способов сделать это:

Первый способ:

print(df1.join(df2))

Второй способ:

print(pd.concat([df1, df2], axis=1))

Третий способ:

print(df1.merge(df2, left_index=True, right_index=True))

Время:

from timeit import timeit
df1 = pd.DataFrame({
    'col_1': [0, 1, 2, 3],
    'col_2': [4, 5, 6, 7]})

df2 = pd.DataFrame({
    'col_3': [6, 4, 3, 1],
    'col_4': [9, 3, 7, 1], 
    'col_5': [19, 13, 17, 10]})

print('First Solution', timeit(lambda: df1.join(df2), number=10000))
print('Second Solution', timeit(lambda: pd.concat([df1, df2], axis=1), number=10000))
print('Third Solution', timeit(lambda: df1.merge(df2, left_index=True, right_index=True), number=10000))

Второе решение выигрывает:

First Solution 8.202560314644044
Second Solution 7.059892805897661
Third Solution 7.59388310738364

Конечно, когда вам не нужнолучшая производительность, вы также можете использовать первый и третий, я в основном использую первый, потому что он короткий.

0 голосов
/ 28 октября 2019

Поскольку у вас нет общего столбца, я предполагаю, что вы хотите объединить их в ряд (ось = 1):

df1.concat(df2,axis=1)

это объединит два кадра данных на оси столбца.

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