当其中一个数据框为空时,使用reduce连接多个数据框



我有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)

最新更新