连接来自两个不同来源的两个数据帧。如果数据框丢失,则无法处理情况

Posted

技术标签:

【中文标题】连接来自两个不同来源的两个数据帧。如果数据框丢失,则无法处理情况【英文标题】:Concat two dataframe from two different source. Unable to handle situation if dataframe missing 【发布时间】:2021-02-20 18:53:51 【问题描述】:

我想连接来自两个来源的两个数据帧,它们的结构相同,但只有行条目不同。而我面临的问题是处理某些情况,例如有时#input 可能是单一的,有时没有,有时两者兼而有之。

我的功能是这样的:

def CombiTwoDf(df1,df2):
if isinstance(df1, pd.DataFrame) and isinstance(df2, pd.DataFrame):
    frames = [df1, df2]
    result = pd.concat(frames)
    result.drop_duplicates(subset =None, keep = 'first', inplace = True)
    return result
if isinstance(df1, pd.DataFrame) and df2 is None:
    return df1
if df2 is None and isinstance(df2, pd.DataFrame):
    return df2
if df1 is None and df2 is None:
    return None

【问题讨论】:

那么你的问题是什么? 嗨 syangjali,如果你喜欢我的回答,你能支持/接受我的回答吗? :) 【参考方案1】:

您可以使用列表推导来创建 2 个数据框的列表,同时过滤掉非数据框对象。然后,如果您有 2 帧,则可以对它们进行连接 + 后处理。如果列表中有 1 帧,则返回该帧,如果有 0:返回 None

def CombiTwoDf(df1,df2):
    frames = [df for df in (df1, df2) if isinstance(df, pd.DataFrame)]
    if len(frames) == 2:
        out = pd.concat(frames).drop_duplicates(keep="first")
    elif len(frames) == 1:
        out = frames[0]
    else:
        out = None
    
    return out

【讨论】:

【参考方案2】:

当唯一的输入是数据帧或无(而不是字符串或标量或其他)时,这有效:

def combine_two_dataframes(df1,df2):
    if isinstance(df1, pd.DataFrame) or isinstance(df2, pd.DataFrame):
        return pd.concat([df1, df2])
    else:
        return None

你也可以使用 try / except:

def combine_two_dataframes(df1,df2):
    try:
        return pd.concat([df1, df2])
    except:
        return None 

【讨论】:

谢谢桑德!我会检查并反馈给你。

以上是关于连接来自两个不同来源的两个数据帧。如果数据框丢失,则无法处理情况的主要内容,如果未能解决你的问题,请参考以下文章

如何连接数据框而不丢失列名中的括号?

PySpark 按最接近的时间值连接两个数据帧

两个数据帧的完全外连接

来自两个数据帧的总数据按行名匹配

R中两个数据帧的条件连接

如何在火花中合并两个不同的数据帧? [复制]