2015-04-29 12 views
2

У меня есть dataframe «DFM»:Python pandas: Эффективно сравнить строки данных?

match    group 
adamant   86 
adamant   86 
adamant bild  86 
360works   94 
360works   94 

где столбец «группы» одно и то же, я хочу, чтобы сравнить содержание сопоставляют колонки два на два и добавить результаты сравнения в другой колонке " результат». Например, ожидаемый результат будет следующим:

group  compare        result 
    86  adamant, adamant       same 
    86  adamant, adamant bild     not same 
    86  adamant, adamant bild     not same 
    94  360works,360works       same 

Может ли кто-нибудь помочь?

+1

Не могли бы вы очистить ваш ожидаемый результат? Я думаю, что форматирование не получилось так, как вы ожидали. В любом случае это кажется немного запутанным – afinit

+0

@benine извините! Я отредактировал текст – UserYmY

+0

Вы хотите выбрать каждую возможную пару в каждой группе? –

ответ

1

Немного Hacky, но это, кажется, работает для меня:

# initialize the list to store the dictionaries 
# that will create the new DataFrame 
new_df_dicts = [] 

# group on 'group' 
for group, indices in dfm.groupby('group').groups.iteritems(): 
    # get the values in the 'match' column 
    vals = dfm.ix[indices]['match'].values 
    # choose every possible pair from the array of column values 
    for i in range(len(vals)): 
     for j in range(i+1, len(vals)): 
      # compute the new values 
      compare = vals[i] + ', ' + vals[j] 
      if vals[i] == vals[j]: 
       result = 'same' 
      else: 
       result = 'not same' 
      # append the results to the DataFrame 
      new_df_dicts.append({'group': group, 'compare': compare, 'result': result}) 

# create the new DataFrame 
new_df = DataFrame(new_df_dicts) 

Вот мой результат:

    compare group result 
0  360works, 360works  94  same 
1  adamant, adamant  86  same 
2 adamant, adamant bild  86 not same 
3 adamant, adamant bild  86 not same 

Ранее я предложил добавление строк инициализированного DataFrame. Создание одного DataFrame из списка словарей, вместо того, чтобы делать много добавлений к DataFrame, работает примерно на 9-10 раз быстрее.

+0

kellehr Спасибо большое. Я получаю эту ошибку: TypeError: неподдерживаемый тип операндов для +: 'float' и 'str' – UserYmY

+1

Что происходит, когда вы пытаетесь выполнить 'compare = str (vals [i]) +', '+ str (vals [j ]) '? –

+0

Thans that work. Проблема в том, что dataframe является настолько большим 193000 строк. Может ли это решение быть более эффективным? – UserYmY

-1

Вот еще один вариант. Не уверен, если это более эффективно, хотя

import itertools 
import pandas as pd 

new_df = pd.DataFrame() 
for grp in set(dfm['group']): 
    for combo in itertools.combinations(dfm[dfm['group'] == grp].index, 2): 
     # compute the new values 
     match1 = dfm['match'][combo[0]] 
     match2 = dfm['match'][combo[0]] 
     compare = match1 + ', ' + match2 
     if match1 == match2: 
      result = 'same' 
     else: 
      result = 'not same' 
     # append the results to the DataFrame 
     new_df = new_df.append({'group': grp, 'compare': compare, 'result': result}, ignore_index=True) 

print new_df 

(форматирование было заимствовано из ответа Джеймса)

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