【问题标题】:Merge pandas df based on 2 keys基于 2 个键合并 pandas df
【发布时间】:2018-02-02 14:41:28
【问题描述】:

我有 2 个 df,我想根据 2 个键合并它们 - ID 和日期: 我关注的只是整个df的一小部分

df_pw6

     ID     date           pw10_0        pw50_0     pw90_0
0   153     2018-01-08     27.88590     43.2872     58.2024
0   2       2018-01-05     11.03610     21.4879     31.6997
0   506     2018-01-08     6.98468      25.3899     45.9486

df_ex

    date         ID   measure f188  f187  f186  f185
0   2017-07-03  501     NaN     1   0.5     7   4.0
1   2017-07-03  502     NaN     0   2.5     5   3.0
2   2018-01-08  506     NaN     5   9.0     9   1.2

如您所见,只有第三行有匹配项。 当我输入时:

#check date
df_ex.iloc[2,0]== df_pw6.iloc[1,1]
True

#check ID
df_ex.iloc[2,1] == df_pw6.iloc[2,0]
True

现在我尝试合并它们:

df19 = pd.merge(df_pw6,df_ex,on=['date','ID'])

我得到一个空的df

当我尝试时:

df19 = pd.merge(df_pw6,df_ex,how ='left',on=['date','ID'])

我明白了:

    ID     date                  pw10_0     pw50_0     pw90_0   measure     f188    f187    f186    f185
0   153 2018-01-08 00:00:00     27.88590    43.2872     58.2024     NaN     NaN     NaN     NaN     NaN
1   2   2018-01-05 00:00:00     11.03610    21.4879     31.6997     NaN     NaN     NaN     NaN     NaN
2   506 2018-01-08 00:00:00     6.98468     25.3899     45.9486     NaN     NaN     NaN     NaN     NaN

我想要的结果应该是:

>      ID     date                    pw10_0       pw50_0     pw90_0   measure f188  f187  f186  f185
> 
> 0   506     2018-01-08 00:00:00     6.98468     25.3899     45.9486   NaN     5     9.0     9   1.2

【问题讨论】:

  • left 连接工作正常,id 506 的日期值在 df_pw6 中为 2018-01-08,而在 df_ex 中为 2018-01-05,因此这两个 id 没有共同的行
  • @GauravTaneja 你的意思是inner 合并。尽管left 合并也按预期工作。 OP,在此示例中,您的两个 DataFrame 有 no 匹配键。
  • 如上述评论所建议的,您在示例中没有匹配项。您能否编辑您的问题,以便我们知道您真正的问题是什么?
  • 我编辑了我的问题,现在有一个匹配项(最后一行),谢谢
  • 我实际上无法复制您的结果,即使用df19 = pd.merge(df_pw6,df_ex,on=['date','ID']) 得到一个空的df

标签: python pandas merge


【解决方案1】:

我已经运行你的代码发布你的编辑,我成功地得到了想要的结果。

import pandas as pd

# copy paste your first df by hand
pw = pd.read_clipboard()

# copy paste your second df by hand
ex = pd.read_clipboard()

pd.merge(pw,ex,on=['date','ID'])
# output [edited. now it is the correct result OP wanted.]

    ID        date   pw10_0   pw50_0   pw90_0  measure  f188  f187  f186  f185
0  506  2018-01-08  6.98468  25.3899  45.9486      NaN     5   9.0     9   1.2

【讨论】:

  • 由于某种原因,我没有得到与您相同的结果,而且无论如何您的结果不是我所希望的,因为 pw10_0, pw50_ 是 NaN,它们应该填充值。请在问题中查看我想要的结果,谢谢。
  • 看来我的df有点奇怪。我没有从文件中读取它,但它是作为脚本的一部分创建的,看起来完全正常。我没有继续处理这个 df,而是将其保存为 excel 文件,然后使用 pd.read_excel 将其从文件夹中再次读取给 pandas。 “新”df(从 excel 中读取)表现正常,只需使用 pd.merge(df_pw6,df_ex,on=['date','ID']) 即可成功合并。我不知道为什么脚本中的 df 会出现这种奇怪的行为。
  • @user88484 啊确实对不起我的不好;让我一会儿回来。
  • @user88484 你是说使用excel中的df并使用上面的命令合并给你想要的结果吗?
  • 是的,我得到了想要的结果。不知何故,相同的 df 行为不同取决于我如何阅读它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2017-06-02
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2017-07-23
  • 2019-01-04
相关资源
最近更新 更多