我有两个不同的数据框,我试图比较。所以,我的第一个数据框有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
答案 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)
我不知道这是否能解决这个问题,但是你的代码有许多非常不合理的特性,如果你修复它们,你至少会得到更多有用的错误。
首先,永远不必像i
和j
一样使用边车整数。在最坏的情况下你可以使用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次。显然你需要指定感兴趣的列。