Соедините два Pandas кадра данных в указанном столбце c с соответствующими значениями - PullRequest
1 голос
/ 21 марта 2020

Я хочу объединить два pandas фрейма данных в «ColA», но дело в том, что значения в «ColA» в этих двух фреймах данных расположены не по порядку, а фреймы данных имеют разную длину. Я хочу объединить их, чтобы отсутствующие значения были изменены на 0, и чтобы значения в «ColA» совпадали.

df1 = pd.DataFrame({"ColA":["num 1", "num 2", "num 3"],
                   "ColB":[5,6,7]})

print(df1)
df2 = pd.DataFrame({"ColA":["num 2", "num 3","num 1", "num 4"],
                   "ColC":[3,2,1,5]})

print(df2)


    ColA  ColB
0  num 1     5
1  num 2     6
2  num 3     7

    ColA  ColC
0  num 2     3
1  num 3     2
2  num 1     1
3  num 4     5

Результат должен выглядеть следующим образом:

# num1 is matched with appropriate values and num4 has the value 0 for "ColB" 

    ColA  ColB  ColC
0  num 1     5     1
1  num 2     6     3
2  num 3     7     2
3  num 4     0     5

1 Ответ

3 голосов
/ 21 марта 2020

Используйте DataFrame.merge с внешним соединением, конвертируйте NaN s в 0 и, при необходимости, в конце конвертируйте dtype s в оригинал по словарю:

d = df1.dtypes.append(df2.dtypes).to_dict()
df = df1.merge(df2, how='outer', on='ColA').fillna(0).astype(d)
print (df)

    ColA  ColB  ColC
0  num 1     5     1
1  num 2     6     3
2  num 3     7     2
3  num 4     0     5

Или используйте concat с преобразованием всех столбцов в целые числа (если это возможно):

df = (pd.concat([df1.set_index('ColA'), 
                df2.set_index('ColA')], axis=1, sort=True)
        .fillna(0)
        .astype(int)
        .rename_axis('ColA')
        .reset_index())
print (df)
    ColA  ColB  ColC
0  num 1     5     1
1  num 2     6     3
2  num 3     7     2
3  num 4     0     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...