簡體   English   中英

在具有不同日期的多列上合並或聯接兩個數據框

[英]Merging or Joining Two Dataframes on Multiple Columns With Different Dates

我正在嘗試合並這兩個數據幀(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來填充到tf和ta或df2中的and 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。

抱歉,這太令人困惑了。 我正在尋找通過合並/聯接執行此操作的最佳方法,或者沒有讓我的循環永遠運行。

預先感謝您的幫助。

我想我很了解你想要什么。 我的想法是,您可以執行以下操作:

您想在日期重合時將數據df2 tfta列替換為數據df1pfpa的列,即:(df1 ['gmDate']。values)==(df2 ['gmDate' ]。值)

在其中,選擇df2的行和列,然后執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM