我有3个数据框,我想在公共列上连接。
,
df1=pd.DataFrame({'a':[1,2,3],'b':[3,5,6],'c':[1,2,5]})
df2=pd.DataFrame({'a':[1,1,3],'b':[3,5,6]})
df3=pd.DataFrame({'a':[1,1,1],'b':[3,5,6],'d':[4,5,6]})
我使用reduce
:
dfs=[df1,df2,df3]
final = reduce(lambda left, right: pd.merge(left, right, on=cols_common), dfs)
问题:其中一个df可能是空的。如果其中一个为空,则该命令将抛出错误。任何建议吗?
编辑:
预期结果是连接的数据框。空数据框应该被忽略。我想知道是否有一种方法可以做到这一点,同时避免使用try except子句进行for循环。
如果需要删除空DataFrame,请使用DataFrame.empty
:
df1=pd.DataFrame({'a':[1,2,3],'b':[3,5,6],'c':[1,2,5]})
df2=pd.DataFrame({'a':[1,1,3],'b':[3,5,6]})
df3=pd.DataFrame()
dfs=[df1,df2,df3]
cols_common = ['a','b']
dfs1 = [x for x in dfs if not x.empty]
final = reduce(lambda left, right: pd.merge(left, right, on=cols_common), dfs1)
print (final)
a b c
0 1 3 1
1 3 6 5
即使数据帧为空,但是也可以正常工作。它应该有用于合并的列:
df1=pd.DataFrame({'a':[1,2,3],'b':[3,5,6],'c':[1,2,5]})
df2=pd.DataFrame({'a':[1,1,3],'b':[3,5,6]})
df3=pd.DataFrame({'a':[1,1,1],'b':[3,5,6],'d':[4,5,6]})
dfs=[df1,df2,df3]
reduce(lambda left, right: pd.merge(left, right, on=['a', 'b']), dfs)
输出:
a b c d
0 1 3 1 4
与空数据帧
df2b = pd.DataFrame([], columns=['a', 'b'])
dfs=[df1,df2b,df3]
reduce(lambda left, right: pd.merge(left, right, on=['a', 'b']), dfs)
输出:
a b c d
帮助函数,确保定义了列
您可以使用辅助函数来确保在数据框架中定义列(这里使用nan进行初始化)
def ensure_columns(df, columns):
df = df.copy()
for col in columns:
if col not in df:
df[col] = [float('nan')]*len(df)
return df
df2b = pd.DataFrame([])
columns = ['a', 'b']
dfs=[df1,df2b,df3]
reduce(lambda left, right: pd.merge(left, ensure_columns(right, columns), on=columns), dfs)