2017-01-02 4 views
5

Я хотел бы выполнить самообучение в кадре данных Pandas, чтобы некоторые строки добавлялись к исходным строкам. Каждая строка имеет маркер «i», указывающий, какая строка должна быть присоединена к нему справа.self-join with Pandas

d = pd.DataFrame(['A','B','C'], columns = ['some_col']) 
d['i'] = [2,1,1] 

In [17]: d 
Out[17]: 
    some_col i 
0  A 2 
1  B 1 
2  C 1 

Желаемый выход:

some_col i some_col_y 
0  A 2   C 
1  B 1   B 
2  C 1   B 

То есть, строка 2 получает добавляется к строке 0, строка 1 в строке 1, строка 1 к строке 2 (как указано в I).

Моя идея о том, как идти об этом было

pd.merge(d, d, left_index = True, right_on = 'i', how = 'left') 

Но он производит что-то совсем другое. Как это сделать правильно?

ответ

3

join с on='i'

d.join(d.drop('i', 1), on='i', rsuffix='_y') 

    some_col i some_col_y 
0  A 2   C 
1  B 1   B 
2  C 1   B 
1

Попробуйте это:

In [69]: d.join(d.set_index('i'), rsuffix='_y') 
Out[69]: 
    some_col i some_col_y 
0  A 2  NaN 
1  B 1   B 
1  B 1   C 
2  C 1   A 

или:

In [64]: pd.merge(d[['some_col']], d, left_index=True, right_on='i', suffixes=['_y','']).sort_index() 
Out[64]: 
    some_col_y some_col i 
0   C  A 2 
1   B  B 1 
2   B  C 1 
4

Вместо использования merge вы также можете использовать индексацию и назначение:

>>> d['new_col'] = d['some_col'][d['i']].values 
>>> d 
    some_col i new_col 
0  A 2  C 
1  B 1  B 
2  C 1  B 
+0

Мне нравится ваш ответ больше, чем у меня. Если OP нуждается в виртуальном столбце - это можно сделать следующим образом: 'd.assign (some_col_y = d ['some_col']. Loc [d ['i']]. Values)' – MaxU