Python 与熊猫自娱自乐

Python 与熊猫自娱自乐,python,pandas,data-structures,dataframe,Python,Pandas,Data Structures,Dataframe,我希望在Pandas数据帧上执行自连接,以便将一些行附加到原始行。每一行都有一个标记“i”,指示应该在右侧将哪一行附加到它 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

我希望在Pandas数据帧上执行自连接,以便将一些行附加到原始行。每一行都有一个标记“i”,指示应该在右侧将哪一行附加到它

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')
但它产生了另外一些东西。如何正确操作?

尝试以下方法:

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
或:


除了使用
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

加入
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

我喜欢你的答案胜过我的。如果OP需要一个虚拟列-可以这样做:
d.assign(some\u col\u y=d['some\u col'].loc[d['i']].values)
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