2015-03-16 4 views
-1

Имея DF со столбцами A и B, я хотел бы добавить дополнительный столбец C, который будет содержать комбинацию значений A и B для каждой строки. Т.е., если у меня есть DF:Доступ к исходному индексу после группового управления

A B 
0 1 1 
1 1 2 
2 2 1 
3 2 2 

Я хотел бы создать:

A B C 
0 1 1 1_1 
1 1 2 1_2 
2 2 1 2_1 
3 2 2 1_2 

Очевидно, что я могу пойти на все ряды ФР и просто объединить значения. Это очень мало для больших таблиц. Я могу также использовать .unique() для столбцов A и B и перебирать все комбинации, создавая векторы col1_un и col2_un соответственно, а затем обновляет соответствующие индексы в таблице, используя что-то вроде

cols_2_merge = ['A','B'] 
    col1_un = DF[cols_2_merge[0]].unique() 
    col2_un = DF[cols_2_merge[1]].unique() 
    for i in range(len(col1_un)): 
     try: 
      ind1 = np.where(DF[cols_2_merge[0]].str.contains(col1_un[i], na=False))[0] 
     except: 
      ind1 = np.where(DF[cols_2_merge[0]] == col1_un[i])[0] 
     for j in range(len(col2_un)): 
      try: 
       ind2 = np.where(DF[cols_2_merge[1]].str.contains(col2_un[j], na=False))[0] 
      except: 
       ind2 = np.where(DF[cols_2_merge[1]] == col2_un[j])[0] 

      new_ind = col1_un[i] + '-' + col2_un[j] 
      tmp_ind = np.in1d(ind1, ind2) 
      ind = ind1[tmp_ind] 
      if len(ind) > 0: 
       DF[new_col_name][ind] = new_ind 

Это по-прежнему медленно. Я могу играть с ним немного больше, не просматривая всю DF, но уменьшая область поиска до индексов, которые пока не были изменены. Еще медленнее.

Существует опция группы, которая делает именно то, что я хочу, нахожу все уникальные пары комбинаций из двух столбцов, и это относительно быстро, но я не понял, как получить доступ к индексу исходного DF для каждая группа. Помогите, пожалуйста?

+1

ли эта работа: 'ФР [«C»] = df ['A']. astype (str) + '_' + df ['B']. astype (str) '? – joris

+0

Как '2 2' стать' 1_2'? –

+0

Предполагалось, что это 2_2 - type ;-( – user3861925

ответ

0

@joris - большое спасибо. Это действительно работало, конечно! БЫСТРО, мне нужно добавить :-)

Для более сложных комбинаций на основе группы можно использовать

GB = DF[cols_2_merge].groupby(cols_2_merge) 
for i in GB.groups: 
    DO WHATEVER YOU WANT... 

Еще раз спасибо!

2

Вы можете это сделать это без использования GroupBy, просто использовать тот факт, что на строках + означает конкатенацию, и что панды делает этот поэлементно на серии:

df['C'] = df['A'].astype(str) + '_' + df['B'].astype(str) 
Смежные вопросы