gpt4 book ai didi

python - 基于三列将一个 Pandas 数据框中的行与另一个数据框匹配

转载 作者:太空狗 更新时间:2023-10-29 19:25:31 27 4
gpt4 key购买 nike

我有两个 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 和 Y 列的值相等的行,并且这是 dfB['TIME'] 的值大于的第一行dfA['ONSET_TIME'] 并为该行返回 dfA['COLOUR'] 的值。

dfA 表示显示器的刷新,其中 X 和 Y 是显示器上项目的坐标,因此每个不同的 ONSET_TIME 都会重复它们(每个 ONSET_TIME 值有 108 对坐标)。

将有多个行,其中两个数据帧中的 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 上的时间)。如果您对此有任何疑问,请告诉我。

关于python - 基于三列将一个 Pandas 数据框中的行与另一个数据框匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24738732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com