微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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)))
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐