在两个不同的Pandas数据帧上循环

2024-04-26 08:33:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同的数据帧,我试图比较。所以,我的第一个数据帧有10行,第二个数据帧有2000行。我要做的是将第一个df中的第一行与另一个df中的2000行进行比较。然后在第一个df中对下一行执行相同的操作。在

这是我目前掌握的代码。它在2000年前运行良好,然后当我应该增加时,它崩溃了。在

i = 1
j = 1
for u in userFrame.iterrows():
    for d in dbFrame.iterrows():
        if userFrame['tag'][i] == dbFrame['tag1'][j]:
            print('Found one!:' + userFrame['tag'][i])
        j += 1
    i += 1

编辑:以下是我得到的错误:

^{pr2}$

Tags: 数据代码in编辑dfforiftag
2条回答

我不知道这是否能解决问题,但是你的代码有很多非常不和谐的特性,如果你修复了它们,你至少会得到更多有用的错误。在

首先,不必像ij那样使用边车整数。在最坏的情况下,您可以使用enumerate,但是pandas已经为您提供了一个索引,可以为您实现这一点!如果您实际查看iterrows()的输出,一旦在df上有{},它就有了您想要的内置边车整数。解决方案:打开iterrows()。。。。。。但无论如何,你根本不必使用整数。在

第二,熊猫可以帮你找东西!您不必自己编写第二个迭代。解决方案:使用.loc

{第三个是你的好主意。解决方案:使用.loc

dbFrame = dbFrame.reset_index().set_index('tag1')
for i,u in userFrame['tag'].iteritems():
    try:
        u2 = dbFrame.loc[u,'col_of_interest']
        print('Found one!: {} = {}'.format(u,u2))
    except:
        pass

没有愚蠢的整数,没有双重迭代。上面的代码有10次迭代,而不是20000次。显然,您需要指定感兴趣的列。在

考虑两个数据帧之间的cross join pandas merge,结果是10x2000条记录,其中较小数据集的每条记录都与较大数据集的每条记录相匹配。Cross Join是一个特殊的SQL查询,返回两个表之间的笛卡尔积(所有可能的集合组合)。本质上是一个没有连接子句的查询。在

但是,在pandas中,您需要首先在dataframe和重命名列中创建一个key变量,以避免重复tags。从那里您可以返回一个匹配的记录数据帧,并避免嵌套的for循环。由于只需要第一行,所以可以在1 X 2000维的交叉连接操作期间对数据帧进行切片。在

userFrame['key'] = 1
dbFrame['key'] = 1

userFrame = userFrame.rename(columns = {'Tag':'Tag_U'})
dbFrame = dbFrame.rename(columns = {'Tag':'Tag_D'})

# CROSS JOIN MERGE (FIRST ROW OF USER DF, ALL ROWS OF DB DF)
crossjoindf = pd.merge(userFrame[:1], dbFrame, on='key')[['Tag_U', 'Tag_D']]

# MATCHING RECORDS
matchingdf = crossjoindf[crossjoindf['Tag_U'] == crossjoindf['Tag_D']]

相关问题 更多 >