【问题标题】:Not sure how to merge data based on conditions不确定如何根据条件合并数据
【发布时间】:2018-07-24 21:45:30
【问题描述】:

df1:

tID  sID  dID  date1 date2
1234 4321 5432 7/12  8/13
7890 5688 4567 8/21  9/30

df2:

sID  dID  date3 
4321 5432 7/20
5688 4567 9/15 

如果:

  • date3 介于 date1date2 之间
  • sID 是一样的
  • dID 是一样的

df3:

tID  sID  dID  date3 
1234 4321 5432 7/20
7890 5688 4567 9/15 

我的第一个想法是遍历两个数据帧并使用 if 语句,但这似乎不是一种有效的方法。

任何帮助将不胜感激。

【问题讨论】:

  • df2 dID 8/21 是错字吗?或者身份证是在那里的一个日期?还必须满足所有 3 个条件还是只满足一个?
  • 是的,对不起!更新
  • @madsthaks 你没有更新df3。另外,您没有回答有关条件的问题。
  • @DennisGolomazov 在这里大胆猜测一下,因为第二行的 sID 似乎不匹配。也可能是错字,也许该行以某种方式向左移动了?
  • 三个都需要满足

标签: python pandas dataframe merge


【解决方案1】:

IIUC,首先将它们设置为相同的索引(如str,如果ID可能在编辑前包含8/21等id。如果所有id都是int,则无需执行astype步骤)

df['sID'] = df.sID.astype(str)
df['dID'] = df.dID.astype(str)
df = df.set_index(['sID', 'dID'])


df2['sID'] = df2.sID.astype(str)
df2['dID'] = df2.dID.astype(str)
df2 = df2.set_index(['sID', 'dID'])

然后使用loc进行过滤和分配

m = df2.index.isin(df.index)
sub = df.loc[df2[m].date3.index]
s = df2[m].date3.between(sub.date1, sub.date2)
df2.loc[:, 'tID'] = df.loc[s[s].index, 'tID']

输出

                date3   tID
sID dID     
4321    5432    7/20    1234
5688    4567    9/15    7890

【讨论】:

    【解决方案2】:
    df3 = pd.merge(df1, df2, on=['sID', 'dID'])
    print df3[df3.date3.between(df3.date1, df3.date2)].drop(['date1', 'date2'], axis=1)
    
        tID   sID   dID date3
    0  1234  4321  5432  7/20
    1  7890  5688  4567  9/15
    

    感谢@RafaelC 提出between 的想法。

    【讨论】:

      猜你喜欢
      • 2023-01-08
      • 1970-01-01
      • 2020-10-13
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多