首页 > 解决方案 > 如图所示,如何巧妙地合并 Dataframe

问题描述

我正在从网络上获取数据,我想通过 Key1 和 Key2 将它们合并在一起。理想的情况是,我们按顺序得到 df1 - df6(图 1)。

但最常见的情况是,我们无法估计接下来可以得到哪一部分数据(图 2)。

图1和图2

在第二种情况下,我想根据 Key1 和 Key1 及其列名将新数据放到正确的位置。如果列或行不存在,则应为其添加新列或行。缺失的数据用 NaN 填充。

我尝试过合并、加入和连接,但我无法归档最终目标。现在我的实现是:合并 df1 - df3 和 df4 - df6,将结果连接在一起。但这还不够“聪明”,如果数据不在这个序列中,有时会发生错误。

主要代码:

    result_daily = pro.daily(ts_code=ts_code, start_date=ts_since, end_date=ts_until)
    result_adjust = pro.adj_factor(ts_code=ts_code, start_date=ts_since, end_date=ts_until)
    result_index = pro.daily_basic(ts_code=ts_code, start_date=ts_since, end_date=ts_until)

    print(uri + ' - Network finished, time spending: ' + str(clock.elapsed_ms()) + 'ms')

    sub_result = None
    sub_result = merge_on_columns(sub_result, result_daily, ['ts_code', 'trade_date'])
    sub_result = merge_on_columns(sub_result, result_adjust, ['ts_code', 'trade_date'])
    sub_result = merge_on_columns(sub_result, result_index, ['ts_code', 'trade_date'])

    result = pd.concat([result, sub_result], ignore_index=True)

还有 merge_on_columns():

def merge_on_columns(df1: pd.DataFrame, df2: pd.DataFrame, columns: str or [str]):
    if df1 is None:
        return df2
    if df2 is None:
        return df1
    if not isinstance(columns, (list, tuple)):
        columns = [columns]
    # https://stackoverflow.com/questions/19125091/pandas-merge-how-to-avoid-duplicating-columns/19125531#19125531
    diff_cols = list(df2.columns.difference(df1.columns))
    # if len(diff_cols) == 0:
    #     df = pd.merge(df1, df2, how='left', on=columns, sort=False)
    # else:
    merge_columns = diff_cols + columns
    df = pd.merge(df1, df2[merge_columns], how='inner', on=columns, sort=False)
    return df

有人可以帮助我。谢谢你。

标签: pythonpandasdataframe

解决方案


推荐阅读