Как сделать левое соединение на нескольких данных - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть несколько фреймов данных с одинаковым именем. Каждый кадр данных имеет одну строку и два столбца. Один столбец является общим для всех фреймов данных. Я хотел бы присоединиться к ним вместе. Предполагая, что имя dataframes совпадает. У меня нет плана отличать их имена друг от друга, так как их так много, и я просто привожу некоторые из них здесь. Можно ли как-нибудь присоединиться к ним и создать желаемый результат, упомянутый ниже?

Вот данные:

  col1     col2_4
0  1         2

  col1      col2_9
0  1         10

  col1     col2_1
0   1         12

   col1    col2_3
0    1        5

Выход:

   col1     col2_4    col2_9   col2_1   col_3
0     1        2         10       12       5

Код:

group = df.groupby([randomcolumnname])
for name, groups in group:
     #do some stuff for groups
     print(groups)
     #I want to join the groups dataframes after this line(some groups dataframes are given above)

Заранее спасибо!

1 Ответ

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

Я полагаю, вам нужно для left join merge со списком фреймов данных по столбцу col1:

dfs = [df1, df2, df3, df4]

from functools import reduce

df = df_final = reduce(lambda left,right: pd.merge(left,right,on='col1', how='left'), dfs)
print (df)
   col1  col2_1  col2_2  col2_3  col2_4
0     1       2      10      12       5

Или для outer join создать индекс с помощью set_index и concat:

df = pd.concat([x.set_index('col1') for x in dfs], axis=1).reset_index()
print (df)
   col1  col2_1  col2_2  col2_3  col2_4
0     1       2      10      12       5

EDIT:

Я думаю, лучше использовать пользовательскую функцию с GroupBy.apply:

def func(x):
    print (x)
    #do some stuff for groups

    return x


group = df.groupby([randomcolumnname]).apply(func)

Если это невозможно, для lsit DataFrames используйте:

dfs = []
group = df.groupby([randomcolumnname])
for name, groups in group:
     #do some stuff for groups

     print(groups)
     dfs.append(groups)
...