我的程序将生成许多小的数据帧,例如
下面的
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)))
)