Pandas:所有可能的行组合

Posted

技术标签:

【中文标题】Pandas:所有可能的行组合【英文标题】:Pandas: all possible combinations of rows 【发布时间】:2019-02-13 01:59:54 【问题描述】:

我的 DataFrame 看起来像..

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 中的值应该是什么 【参考方案1】:

考虑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

【讨论】:

以上是关于Pandas:所有可能的行组合的主要内容,如果未能解决你的问题,请参考以下文章

数据框中所有可能的列组合 -pandas/python

R如何排列数据帧的所有行,以便在列表中返回所有可能的行组合?

如何组合 pandas df 以便可以合并具有置换 col1 和 col2 值的行,其中仅包含一个组合并汇总计数列

如何创建所有可能的熊猫列组合?

Pandas - Groupby 多索引级别,获取可能的组合,然后转换数据

pandas条件组合筛选和按范围筛选