pandas 如何合并两个不同时间和大小 Dataframe

0yg35tkg  于 2023-02-07  发布在  其他
关注(0)|答案(3)|浏览(145)

我正在尝试合并这两个 Dataframe ,并保留所有的行和列。它们在"时间"列下有不同的时间,所以我希望它们以时间顺序的方式合并。
DF1:
| 时间|运行标识|重量|
| - ------|- ------|- ------|
| 无|H1|五百|
| 二十四|H1|四百|
| 四十八|H1|三百|
| 无|氢|九百|
| 二十四|氢|八百|
| 四十八|氢|七百|
DF2:
| 时间|运行标识|累加器|
| - ------|- ------|- ------|
| 0.5 |H1|一百|
| 十个|H1|二百|
| 四十|H1|三百|
| 六十|H1|四百|
| 0.5 |氢|九百|
| 五个|氢|一千|
| 三十五|氢|1100年|
| 七十|氢|小行星1200|
如何将这两个表合并为:
| 时间|运行标识|重量|累加器|
| - ------|- ------|- ------|- ------|
| 无|H1|五百||
| 0.5 |H1||一百|
| 十个|H1||二百|
| 二十四|H1|四百||
| 四十|H1||三百|
| 四十八|H1|三百||
| 六十|H1||四百|
| 无|氢|九百||
| 0.5 |氢||九百|
| 五个|氢||一千|
| 二十四|氢|八百||
| 三十五|氢||1100年|
| 四十八|氢|七百||
| 七十|氢||小行星1200|
我试过:

mergedf = df1.merge(df2, how='outer')

但是它将DF1堆叠在DF2的顶部。

w6mmgewl

w6mmgewl1#

一个选项是使用combine_first

cols = ["run_id", "time"]
​
out = (
        df1.set_index(cols)
              .combine_first(df2.set_index(cols))
              .reset_index().sort_values(by=cols)
           [["time", "run_id", "weight", "totalizer"]]
       )

输出:

print(out)

    time run_id  weight  totalizer
0    0.0     H1   500.0        NaN
1    0.5     H1     NaN      100.0
2   10.0     H1     NaN      200.0
3   24.0     H1   400.0        NaN
4   40.0     H1     NaN      300.0
5   48.0     H1   300.0        NaN
6   60.0     H1     NaN      400.0
7    0.0     H2   900.0        NaN
8    0.5     H2     NaN      900.0
9    5.0     H2     NaN     1000.0
10  24.0     H2   800.0        NaN
11  35.0     H2     NaN     1100.0
12  48.0     H2   700.0        NaN
13  70.0     H2     NaN     1200.0
g0czyy6m

g0czyy6m2#

您可以简单地在您已经完成的操作之后添加行:

mergedf = df1.merge(df2, how='outer') # your current code
mergedf.sort_values(['run_id', 'time']) # add this

在此阅读更多信息:https://stackoverflow.com/a/17141755/2650341

bnlyeluc

bnlyeluc3#

你可以用Pandas的merge_ordered

df_merged=pd.merge_ordered(df1,df2, on=['run_id','time'])

相关问题