Агрегировать данные по фреймам данных на основе строки в первом столбце - PullRequest
0 голосов
/ 01 ноября 2018

Мне интересно, какой самый экономичный способ объединения информации из нескольких информационных фреймов в один новый основан на сопоставлении идентификатора.

У каждого df есть столбец "member_id", и у каждой строки свой идентификатор участника. Я хочу закончить с одним df, который имеет один столбец member_id и счет от каждого из других df в других столбцах.

Поэтому мне нужна переменная для хранения идентификатора участника, циклически проходить по каждой строке и поднимать необходимые столбцы. Затем все соответствующие оценки должны быть помещены в соответствующую строку, связанную с правильным идентификатором участника.

Я не уверен, что это лучший способ решить проблему? В какой момент имеет смысл сопоставление идентификатора участника? Рано или поздно?

Входные данные и ожидаемые результаты:

### three datasets 

d1 = {'part_id': ['PartID_1234', 'PartID_5678'], 'col2': [1, 2]}
df1 = pd.DataFrame(data=d1)

d2 = {'part_id': ['PartID_1234', 'PartID_5678'], 'col2': [3, 4]}
df2 = pd.DataFrame(data=d2)

d3 = {'part_id': ['PartID_5678', 'PartID_1234'], 'col2': [5, 6]}
df3 = pd.DataFrame(data=d3)


### aggregated dataset based on ID

import numpy as np

result = pd.DataFrame(np.array([['PartID_1234', 1, 3, 6], ['PartID_5678', 2, 4, 5]]))

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете использовать merge с how='outer' для ожидаемого эффекта внешнего соединения:

df1.merge(df2, on='part_id', how='outer').merge(df3, on='part_id', how='outer')

    part_id     col2_x  col2_y  col2
0   PartID_1234   1        3    6
1   PartID_5678   2        4    5
0 голосов
/ 02 ноября 2018

Я полагаю, что вам нужно concat с set_index для каждого DataFrame для индексации по столбцу part_id в понимании списка:

dfs = [df1, df2, df3]
dfs = [x.set_index('part_id')['col2'] for x in dfs]
df = pd.concat(dfs, axis=1).reset_index()
df.columns = range(len(df.columns))
print (df)

             0  1  2  3
0  PartID_1234  1  3  6
1  PartID_5678  2  4  5

Если хотите первый столбец в индексе:

dfs = [df1, df2, df3]
dfs = [x.set_index('part_id')['col2'] for x in dfs]
df = pd.concat(dfs, axis=1, ignore_index=True)
print (df)

             0  1  2
PartID_1234  1  3  6
PartID_5678  2  4  5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...