【问题标题】:Merging or Joining Two Dataframes on Multiple Columns With Different Dates在具有不同日期的多列上合并或连接两个数据框
【发布时间】:2019-08-29 00:02:44
【问题描述】:

我正在尝试合并这两个数据帧(df1 和 df2):

gmDate n pf pa 0 2012-10-31 ATL 0 0 1 2012-10-31 BKN 0 0 2 2012-10-31 BOS 107 120 3 2012-10-31 CHA 0 0 4 2012-10-31 CHI 0 0 5 2012-10-31 CLE 94 84 6 2012-10-31 DAL 99 91 7 2012-10-31 DEN 0 0 8 2012-10-31 DET 0 0 9 2012-10-31 GS 0 0

gmDate t tw tf ta o ow of oa 0 2012-10-30 WAS 0 0 0 CLE 1 0 0 1 2012-10-30 BOS 0 0 0 MIA 1 0 0 2 2012-10-30 DAL 1 0 0 LAL 0 0 0 3 2012-10-31 DEN 0 0 0 PHI 1 0 0 4 2012-10-31 IND 1 0 0 TOR 0 0 0 5 2012-10-31 HOU 1 0 0 DET 0 0 0 6 2012-10-31 SAC 0 0 0 CHI 1 0 0 7 2012-10-31 SA 1 0 0 NO 0 0 0 8 2012-10-31 DAL 0 0 0 UTA 1 0 0 9 2012-10-31 GS 1 0 0 PHO 0 0 0

根据匹配 gmDate 和 n 与 df2 中的 t 或 o,我需要 df1 中的 pf 和 pa 填充到 df2 中的 tf 和 ta 或 of 和 oa 中。 df1 包括日历中的每一天,无论那天是否有球队参加比赛,而 df2 仅包含球队参加比赛的天数。我无法获得合并或加入为我工作。

目前我一直在尝试通过运行两个单独的 for 循环来做到这一点:

for s in range(0, len(df1)): for d in range(0, len(df2): if df1.iloc[s,0] == df2.iloc[d,0] and df1.iloc[s,1] == df2.iloc[d,1]: df2.iloc[d,3] = df1.iloc[s,2] df2.iloc[d,4] = df1.iloc[s,3]

然后:

for s in range(0, len(df1)): for d in range(0, len(df2): if df1.iloc[s,0] == df2.iloc[d,0] and df1.iloc[s,1] == df2.iloc[d,5]: df2.iloc[d,7] = df1.iloc[s,2] df2.iloc[d,8] = df1.iloc[s,3]

他们每个人都需要很长时间才能运行。 df1 的长度为 29,520,df2 的长度为 7,379。

抱歉,如果这太混乱了。我正在寻找通过合并/连接执行此操作的最佳方法,或者不要让我的循环永远运行。

提前感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案1】:

    我想我已经很清楚你想要什么了。我的想法是你可以这样做:

    当日期重合时,您希望将数据框 df2 的列 tfta 替换为数据框 df1pfpa 的列: (df1 ['gmDate'].values) == (df2 ['gmDate'].values)

    在那里你选择df2what do you want to replace 的行和列,做:

    df2.loc[(df1['gmDate'].values)==(df2['gmDate'].values),['tf','ta']]
    

    这些是什么:

        tf  ta
    3   0   0
    4   0   0
    5   0   0
    6   0   0
    7   0   0
    8   0   0
    9   0   0
    

    并分配给它:

    df1.loc[(df1['gmDate'].values)==(df2['gmDate'].values),['pf','pa']].values
    

    这些是什么:

    array([[ 0,  0],
           [ 0,  0],
           [94, 84],
           [99, 91],
           [ 0,  0],
           [ 0,  0],
           [ 0,  0]])
    

    在相反的情况下也可以得到代码:

    df2.loc[(df1['gmDate'].values)==(df2['gmDate'].values),['tf','ta']]=df1.loc[(df1['gmDate'].values)==(df2['gmDate'].values),['pf','pa']].values
    df2.loc[(df1['gmDate'].values)!=(df2['gmDate'].values),['of','oa']]=df1.loc[(df1['gmDate'].values)!=(df2['gmDate'].values),['pf','pa']].values
    

    df2 输出:

        gmDate      t   tw  tf  ta  o   ow  of  oa
    0   2012-10-30  WAS 0   0   0   CLE 1   0   0
    1   2012-10-30  BOS 0   0   0   MIA 1   0   0
    2   2012-10-30  DAL 1   0   0   LAL 0   107 120
    3   2012-10-31  DEN 0   0   0   PHI 1   0   0
    4   2012-10-31  IND 1   0   0   TOR 0   0   0
    5   2012-10-31  HOU 1   94  84  DET 0   0   0
    6   2012-10-31  SAC 0   99  91  CHI 1   0   0
    7   2012-10-31  SA  1   0   0   NO  0   0   0
    8   2012-10-31  DAL 0   0   0   UTA 1   0   0
    9   2012-10-31  GS  1   0   0   PHO 0   0   0
    

    【讨论】:

    • 这正是我正在寻找的输出。我只是不明白你给我的代码的应用。我看到你在前面有布尔表达式,我不确定你是如何建议我实现这个的。再次感谢您的帮助。
    • 如果您有任何问题,请不要犹豫!
    • 我尝试运行你游戏我的第一行 (df2.loc[(df1['gmDate'].values)==(df2['gmDate'].values),['tf','ta']]) 它返回一个 False。如果我将 == 更改为 a =,则会收到指向 = 的语法错误。
    • 另外,我需要同时匹配日期 (gmDate) 和团队名称 (n & t) 以将值分配给 tf 和 ta。
    • 有了你展示的数据框,我需要一个包含所有可能出现的问题的数据框来解决它
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2017-06-08
    • 2019-05-23
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多