循环使用两个不同的Pandas Dataframes

时间:2016-02-12 00:24:35

标签: python numpy pandas

我有两个不同的数据框,我试图比较。所以,我的第一个数据框有10行,第二个有2,000行。我想要做的是将我的第一个df中的第一行与另一个df中的所有2,000行进行比较。然后在我的第一个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

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

  File "C:\Users\david\Desktop\CC Project\test.py", line 158, in Analyze
    if userFrame['tag'][i] == dbFrame['tag1'][j]:
  File "C:\Python34\lib\site-packages\pandas\core\series.py", line 557, in __getitem__
    result = self.index.get_value(self, key)
  File "C:\Python34\lib\site-packages\pandas\core\index.py", line 1790, in get_value
    return self._engine.get_value(s, k)
  File "pandas\index.pyx", line 103, in pandas.index.IndexEngine.get_value (pandas\index.c:3204)
  File "pandas\index.pyx", line 111, in pandas.index.IndexEngine.get_value (pandas\index.c:2903)
  File "pandas\index.pyx", line 157, in pandas.index.IndexEngine.get_loc (pandas\index.c:3843)
  File "pandas\hashtable.pyx", line 303, in pandas.hashtable.Int64HashTable.get_item (pandas\hashtable.c:6525)
  File "pandas\hashtable.pyx", line 309, in pandas.hashtable.Int64HashTable.get_item (pandas\hashtable.c:6463)
KeyError: 1644

2 个答案:

答案 0 :(得分:1)

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

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

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']]

答案 1 :(得分:1)

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

首先,永远不必像ij一样使用边车整数。在最坏的情况下你可以使用enumerate,但是大熊猫已经为你提供了一个为你做这个的索引!如果您在iterrows()reset_index()后实际查看df的输出,则它会内置您想要的边车整数。 解决方案:解压缩iterrows() ......但无论如何,您根本不必使用整数。

其次,大熊猫可以为你找东西!你不必自己写第二次迭代。 解决方案:使用.loc

第三,你正在使用"chained indexing",这在熊猫中绝不是一个好主意。 解决方案:使用.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次迭代而不是20,000次。显然你需要指定感兴趣的列。