在python pandas循环中将大数据框中的许多子数据框合并

我的程序将生成许多小的数据帧,例如
下面的

       Column_A  Column_B
 row1         1         2

       Column_A  Column_B
 row2         3         4

       Column_C  Column_D
 row1         5         6

       Column_C  Column_D
 row2         7         8

我希望它们合并为

       Column_A  Column_B  Column_C  Column_D
 row1         1         2         5         6
 row2         3         4         7         8

当数据帧需要一次合并一个时,该怎么做.
生成较小数据帧的代码

 df = {}
 df[0] = pd.DataFrame({'Column_A' : [1], 
                       'Column_B' : [2]},
                      index = ["row1"])
 df[1] = pd.DataFrame({'Column_A' : [3],
                       'Column_B' : [4]},
                       index = ["row2"])
 df[2] = pd.DataFrame({'Column_C' : [5],
                       'Column_D' : [6]},
                      index = ["row1"]) 
 df[3] = pd.DataFrame({'Column_C' : [7],
                       'Column_D' : [8]},
                      index = ["row2"])

我尝试使用merge和concat,但是它们总是最终通过用_x,_y追加现有列或仅重复这些列来创建更多列

例如,按以下方式合并

pdf = pd.DataFrame()

for i in range(4):
    pdf = pdf.merge(pd.DataFrame(df[i], index=["row{}".format(((i)%2)+1)]), how='outer', left_index=True, right_index=True)

产生

      Column_A_x  Column_B_x  Column_A_y  Column_B_y  Column_C_x  Column_D_x  \
row1         1.0         2.0         NaN         NaN         5.0         6.0   
row2         NaN         NaN         3.0         4.0         NaN         NaN   

      Column_C_y  Column_D_y  
row1         NaN         NaN  
row2         7.0         8.0  

有人可以帮助我以正确的方式合并它吗

解决方法:

如果您可以通过任何方式将左右部件放在单独的容器中,则将对您有很大帮助.例如.一个列中的A和B列,另一个列中的C和D列.这样,您可以很容易地使用pandas.concat将它们组合在一起.在建立了两半之后,在这种情况下,您需要使用索引merge.

使用原始的df字典:

In [11]: pd.concat([df[0], df[1]]).merge(pd.concat([df[2], df[3]]), left_index=True, right_index=True)
Out[11]: 
      Column_A  Column_B  Column_C  Column_D
row1         1         2         5         6
row2         3         4         7         8

使用左右一半的容器,代码的读取效果会更好一些(并且不需要循环):

left = [pd.DataFrame({'Column_A' : [1], 
                      'Column_B' : [2]},
                     index = ["row1"]),
        pd.DataFrame({'Column_A' : [3],
                      'Column_B' : [4]},
                     index = ["row2"])]

right = [pd.DataFrame({'Column_C' : [5],
                       'Column_D' : [6]},
                      index = ["row1"]),
         pd.DataFrame({'Column_C' : [7],
                       'Column_D' : [8]},
                      index = ["row2"])]

df = pd.concat(left).merge(pd.concat(right), left_index=True, right_index=True)

最后,如果您别无选择,只能将它们存储在示例中的字典中:

from functools import reduce, partial
from itertools import groupby

pdf = reduce(
    partial(pd.merge, left_index=True, right_index=True, how='outer'),
    (pd.concat(list(g))
     for cols, g in groupby(sorted(df.values(),
                                   key=lambda df_: tuple(df_.columns)),
                            lambda df_: tuple(df_.columns)))
)

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...