Pandas:行的所有可能组合

4
我有一个类似的数据框,看起来像...
ID   c1   c2   cX
r1   2    3    ..   
r2   8    9    ..
rY   ..  

我希望生成一个新的DataFrame,其中包含所有可能的(两部分)行组合,并连接两个组合行的列(以便新DF将有两倍的列)。结果应如下所示:

ID       c1_r1   c1_r2   c2_r1   c2_r2   cX_rA
r1_r2    2        8        3       9       ..
r1_r3    ..      ..       ..       ..
rA_rB    ..                                

ID名称并不重要(甚至可以是MultiIndex),列的顺序也不重要。
如何处理这个问题?

我了解你试图提供一个最小化的示例,但那似乎太过简洁。你能否发布一个实际的df和最终结果?因为例如我对于单元格c1_r1r1_r3应该有什么值感到困惑。 - rafaelc
1个回答

7
请考虑使用df
    c1  c2
ID        
r1   2   3
r2   8   9
r3   0   7

我会这样做。
from itertools import combinations

a, b = map(list, zip(*combinations(df.index, 2)))

print(a, b, sep='\n')

['r1', 'r1', 'r2']
['r2', 'r3', 'r3']

那么使用 pd.concat
d = pd.concat(
    [df.loc[a].reset_index(), df.loc[b].reset_index()],
    keys=['a', 'b'], axis=1
)

d

    a         b      
   ID c1 c2  ID c1 c2
0  r1  2  3  r2  8  9
1  r1  2  3  r3  0  7
2  r2  8  9  r3  0  7

最后,收尾工作。
d.set_index([('a', 'ID'), ('b', 'ID')]).rename_axis(['a', 'b'])

       a     b   
      c1 c2 c1 c2
a  b             
r1 r2  2  3  8  9
   r3  2  3  0  7
r2 r3  8  9  0  7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接