2016-02-12 2 views
2

У меня есть два разных кадра данных, которые я пытаюсь сравнить. Итак, мой первый фрейм данных имеет 10 строк, а второй - 2000. То, что я пытаюсь сделать, это сравнить первую строку в моем первом df со всеми 2000 в другом df. Затем сделайте то же самое для следующей строки в моем первом df.Зацикливание над двумя различными файловыми кадрами Pandas

Вот код, который у меня есть. Он работает отлично через первые 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 

Edit: вот ошибки я получаю:

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 до нуля на каждой итерации внешней петли? В противном случае я, я продолжаю неограниченное увеличение –

ответ

1

Рассмотрим cross join pandas merge между двумя кадрами данных, в результате чего в 10 X 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 качества, и если вы их исправить, вы можете получить, по крайней мере, более полезные ошибки.

Во-первых, никогда не нужно использовать целые целые числа, как у вас, с i и j. Вы можете использовать enumerate в худшем случае, но pandas уже дает вам индекс, который сделает это за вас! Если вы действительно посмотрите на результат iterrows(), как только у вас есть reset_index() на вашем df s, у него есть целые числа коляски, которые вы хотите, встроенные. РЕШЕНИЕ: распаковать 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. Очевидно, вам нужно указать интересующий столбец.

Смежные вопросы