首页 > 解决方案 > 合并数据框时按列分组

问题描述

我在 for 循环中将几个数据帧合并为一个数据帧。像这样的东西:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(data=np.random.randint(0,100,(2,5)),columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0,100,(2,5)),columns=list('GHABC'))
df1 = df1.merge(df2, how='outer', left_index=True, right_index=True,suffixes=('', '_' + 'second'))

每个数据框中的几列具有相似的名称,因此每次有这样的列时,我都会添加一个后缀。它变得一团糟。此外,我希望能够快速访问第一个表、第二个表等中的所有列。有没有办法合并这些列但将它们保持为一个组?这样我就不需要更改列名并且可以更轻松地访问每个数据集的所有列?

标签: pythonpandasdataframemerge

解决方案


这是一种在MultiIndex的帮助下水平合并数据帧的方法,与垂直合并相比,它具有一些优势。例如,您不会有很多字段,并且在水平合并的情况下,NaNdtype 不会从int变为喜欢。float

import numpy as np
import pandas as pd


df1 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
                   columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
                   columns=list('GHABC'))
dfs = [df1, df2]
result = pd.concat(dfs, axis=1, keys=range(len(dfs)))
print(result)

这将给出:

    0                   1                
    A   B   C   D   E   G   H   A   B   C
0  41  49  13  36  57  28  12  82  18  67
1  72  91  34  17  12   6  67  98  36  25

您可以循环访问每个组:

for source_index, df in result.groupby(axis=1, level=0):
    print(df)
    0                
    A   B   C   D   E
0  41  49  13  36  57
1  72  91  34  17  12
    1                
    G   H   A   B   C
0  28  12  82  18  67
1   6  67  98  36  25

或单独:

gb = result.groupby(axis=1, level=0)
first_group = gb.get_group(0)
print(first_group)
    0                
    A   B   C   D   E
0  41  49  13  36  57
1  72  91  34  17  12

参考:


推荐阅读