2016-02-12 106 views
2

我有兩個不同的數據幀,我試圖比較。所以,我的第一個數據框有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 

編輯:這裏是我得到的錯誤:

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

將i,j重置爲外循環的每次迭代爲零?否則,我,j繼續無限增加 –

回答

1

考慮兩個數據幀之間的cross join pandas merge,導致10×2000記錄,其中較小的數據集的每一條記錄與每個記錄相匹配更大的數據集。 Cross Join是一個特殊的SQL查詢,返回兩個表之間的笛卡爾積(所有可能的集合組合)。基本上是一個沒有連接子句的查詢。

但是,在熊貓中,您需要首先在兩個數據框中創建一個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']] 
1

我不知道這是否會解決這個問題,但你的代碼有許多非常unpythonic素質,如果你解決這些問題,你可以得到的,至少,更有幫助的錯誤。

首先,沒有必要像使用ij那樣使用邊車整數。在最壞的情況下,您可以使用enumerate,但熊貓已經爲您提供了一個可以爲您做到這一點的索引!如果您在df上有的輸出結果,請輸入reset_index(),它內置了您想要的邊車整數。 解決方案:解壓縮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次。顯然你需要指定感興趣的列。