python - 如图所示,如何巧妙地合并 Dataframe
问题描述
我正在从网络上获取数据,我想通过 Key1 和 Key2 将它们合并在一起。理想的情况是,我们按顺序得到 df1 - df6(图 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
有人可以帮助我。谢谢你。
解决方案
推荐阅读
- java - 为什么我可以在 textPersonName 中输入数字?
- angular - 如何在 Angular 中维护请求?
- python - PYINSTALLER - EXE 文件不要让程序响亮 - 缺少模块
- enums - 连接 2 枚举类型变量集
- ios - 从终端添加按需资源
- python - 将文本插入 txt 文件时出现错误
- validation - 验证laravel中唯一字段的json数据
- python - Tkinter - 使用单击而不是双击从树视图中选择一个项目(在树视图项目选择上回调)
- python-3.x - 如何在循环中删除列表中的元素?
- node.js - 如何将heroku cedar-14 堆栈应用程序升级到最新的heroku 堆栈(即升级到heroku 18)