![](/img/trans.png)
[英]Merge rows from one dataframe that do not match specific columns in another dataframe Python Pandas
[英]Match rows in one Pandas dataframe to another based on three columns
我有兩個Pandas數據框,一個很大(30000+行),一個很小(100+行)。
dfA類似於:
X Y ONSET_TIME COLOUR
0 104 78 1083 6
1 172 78 1083 16
2 240 78 1083 15
3 308 78 1083 8
4 376 78 1083 8
5 444 78 1083 14
6 512 78 1083 14
... ... ... ... ...
dfB類似於:
TIME X Y
0 7 512 350
1 1722 512 214
2 1906 376 214
3 2095 376 146
4 2234 308 78
5 2406 172 146
... ... ... ...
我要為dfB中的每一行找到dfA中的X AND Y列的值相等且這是dfB ['TIME']的值大於dfA ['的第一行的行ONSET_TIME']並為此行返回dfA ['COLOUR']的值。
dfA表示顯示器的刷新,其中X和Y是顯示器上項目的坐標,因此對於每個不同的ONSET_TIME重復其自身(每個ONSET_TIME值有108對coodinates)。
將有多個行,兩個數據幀中的X和Y相等,但是我也需要與時間匹配的行。
我已經使用for循環和if語句完成此操作,只是為了看看它可以完成,但是顯然,鑒於數據幀的大小,這需要很長時間。
for s in range(0, len(dfA)):
for r in range(0, len(dfB)):
if (dfB.iloc[r,1] == dfA.iloc[s,0]) and (dfB.iloc[r,2] == dfA.iloc[s,1]) and (dfA.iloc[s,2] <= dfB.iloc[r,0] < dfA.iloc[s+108,2]):
return dfA.iloc[s,3]
可能有一種更有效的方法來執行此操作,但是這是一種沒有那些較慢的for循環的方法:
import pandas as pd
dfB = pd.DataFrame({'X':[1,2,3],'Y':[1,2,3], 'Time':[10,20,30]})
dfA = pd.DataFrame({'X':[1,1,2,2,2,3],'Y':[1,1,2,2,2,3], 'ONSET_TIME':[5,7,9,16,22,28],'COLOR': ['Red','Blue','Blue','red','Green','Orange']})
#create one single table
mergeDf = pd.merge(dfA, dfB, left_on = ['X','Y'], right_on = ['X','Y'])
#remove rows where time is less than onset time
filteredDf = mergeDf[mergeDf['ONSET_TIME'] < mergeDf['Time']]
#take min time (closest to onset time)
groupedDf = filteredDf.groupby(['X','Y']).max()
print filteredDf
COLOR ONSET_TIME X Y Time
0 Red 5 1 1 10
1 Blue 7 1 1 10
2 Blue 9 2 2 20
3 red 16 2 2 20
5 Orange 28 3 3 30
print groupedDf
COLOR ONSET_TIME Time
X Y
1 1 Red 7 10
2 2 red 16 20
3 3 Orange 28 30
基本思想是合並兩個表,這樣您就可以將一個表中的時間在一起。 然后,我篩選了最大的記錄(最接近dfB上的時間)。 如果您對此有疑問,請告訴我。
使用merge()
-它就像SQL中的JOIN
一樣工作-您已經完成了第一部分。
d1 = ''' X Y ONSET_TIME COLOUR
104 78 1083 6
172 78 1083 16
240 78 1083 15
308 78 1083 8
376 78 1083 8
444 78 1083 14
512 78 1083 14
308 78 3000 14
308 78 2000 14'''
d2 = ''' TIME X Y
7 512 350
1722 512 214
1906 376 214
2095 376 146
2234 308 78
2406 172 146'''
import pandas as pd
from StringIO import StringIO
dfA = pd.DataFrame.from_csv(StringIO(d1), sep='\s+', index_col=None)
#print dfA
dfB = pd.DataFrame.from_csv(StringIO(d2), sep='\s+', index_col=None)
#print dfB
df1 = pd.merge(dfA, dfB, on=['X','Y'])
print df1
結果:
X Y ONSET_TIME COLOUR TIME
0 308 78 1083 8 2234
1 308 78 3000 14 2234
2 308 78 2000 14 2234
然后,您可以使用它來過濾結果。
df2 = df1[ df1['ONSET_TIME'] < df1['TIME'] ]
print df2
結果:
X Y ONSET_TIME COLOUR TIME
0 308 78 1083 8 2234
2 308 78 2000 14 2234
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.