我有几个数据帧df1,df2,...带有dublicate数据,部分重叠的列和行((见下文)
如何将所有数据帧整合到一个数据帧中。
df1 = pd.DataFrame({'A': [1,2], 'B': [4,5]}, index=['a', 'b'])
df2 = pd.DataFrame({'B': [5,6], 'C': [8,9]}, index=['b', 'c'])
df3 = pd.DataFrame({'A': [2,3], 'B': [5,6]}, index=['b', 'c'])
df4 = pd.DataFrame({'C': [7,8], index=['a', 'b'])
df5 = pd.DataFrame({'A': [1], 'B': [4], 'C': [7]}, index=['a'])
....
补充:示例数据结构
A B C
a 1 4 7
b 2 5 8
c 3 6 9
补充说:我真正想要的是对于以下脚本更有效的方法,对于大型数据帧来说这实际上很慢
dfs =[df1, df2, df3, df4, df5]
cols, rows = [], []
for df in dfs:
cols = cols + df.columns.tolist()
rows = rows + df.index.tolist()
cols = np.unique(cols)
rows = np.unique(rows)
merged_dfs = pd.DataFrame(data=np.nan, columns=cols, index=rows)
for df in dfs:
for col in df.columns:
for row in df.index:
merged_dfs[col][row] = df[col][row]
dfs =[df1, df2, df3, df4, df5]
# create empty DataFrame with all cols and rows
cols, rows = [], []
for df_i in dfs:
cols = cols + df_i.columns.tolist()
rows = rows + df_i.index.tolist()
cols = np.unique(cols)
rows = np.unique(rows)
df = pd.DataFrame(data=np.NaN, columns=cols, index=rows)
# fill DataFrame
for df_i in dfs:
df.loc[df_i.index, df_i.columns] = df_i.values
答案 0 :(得分:1)
与其他答案相同,但功能略有不同:
def multiple_merge(lst_dfs, on):
reduce_func = lambda left,right: pd.merge(left, right, on=on)
return reduce(reduce_func, lst_dfs)
此处,lst_dfs
是数据框列表
答案 1 :(得分:0)
这是保留索引的更新版本:
from functools import reduce
dfs = [df1, df2, df3, df3, df5]
def my_merge(df1, df2):
res = pd.merge(df1, df2, how='outer', left_index=True, right_index=True)
cols = sorted(res.columns)
pairs = []
for col1, col2 in zip(cols[:-1], cols[1:]):
if col1.endswith('_x') and col2.endswith('_y'):
pairs.append((col1, col2))
for col1, col2 in pairs:
res[col1[:-2]] = res[col1].combine_first(res[col2])
res = res.drop([col1, col2], axis=1)
return res
print(reduce(my_merge, dfs))
输出:
A B C
a 1 4 7
b 2 5 8
c 3 6 9
这将是一种方式:
from functools import reduce # Python 3 only
dfs = [df1, df2, df3, df3, df5]
def my_merge(df1, df2):
return pd.merge(df1, df2, how='outer')
merged_dfs = reduce(my_merge, dfs)
结果:
A B C
0 1 4 NaN
1 2 5 8
2 NaN 6 9
3 3 6 NaN
4 1 4 7
您可以通过设置how
:
如何:{'离开','对','外部','内部'},默认'内部&# 39;
- left:仅使用左框架中的键(SQL:左外连接)
- 右:仅使用右框架中的键(SQL:右外连接)
- outer:使用两个帧中的键的并集(SQL:全外连接)
- inner:使用两个框架中的键交叉(SQL:内部联接)
如果您喜欢lambda
,请使用此版本获得相同的结果:
reduce(lambda df1, df2: pd.merge(df1, df2, how='outer'), dfs)