簡體   English   中英

在python pandas的循環中合並大數據幀中的許多子數據幀

[英]Merge many sub-dataframes in a big dataframe in a loop in 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將它們拼湊在一起。 在構建了兩半之后,您需要在這種情況下使用索引合並它們。

使用原始的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)))
)

試試這個:

In [186]: result = pd.concat([df[key].reset_index() for key in df.keys()],
   .....:                    ignore_index=True) \
   .....:            .set_index('index') \
   .....:            .groupby(level=0) \
   .....:            .sum() \
   .....:            .astype(int)

In [187]: result
Out[187]:
       Column_A  Column_B  Column_C  Column_D
index
row1          1         2         5         6
row2          3         4         7         8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM