python 如何创建一列项目的所有组合,并每次选择其他列中的一个?

kmbjn2e3  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(105)

例如,让我们考虑下面的DataFrame:

id  metric_a  metric_b
0   a     1         2
1   b     10        20
2   c     30        40

所得到的 Dataframe 将由id的所有组合组成,即n2行(方阵)。
在我们的例子中,由于我们有3个唯一的id,所以总共会得到9行。
现在,假设每一行实际上是一对x-y的id,我想用metric_a表示x,用metric_b表示y,其中xy只是给定行的两个id。
为了说明这一点:

x   y  metric_a  metric_b
0   a   a    1         2
1   a   b    1         20
2   a   c    1         40
3   b   a    10        2
4   b   b    10        20
5   b   c    10        40
6   c   a    30        2
7   c   b    30        20
8   c   c    30        40

实现这一点的一种方法是首先创建itertools.product的所有可能组合,然后将初始 Dataframe 合并两次,第一次合并x的度量,第二次合并y的度量。
我想到的另一种方法是:

# creating all the combinations of ids
pd.DataFrame(list(itertools.product(df['id'], df['id'])))

# creating all the combinations of metrics
pd.DataFrame(list(itertools.product(df['metric_a'], df['metric_b'])))

# some more code to concat those two horizontally..

然而,我认为应该有一个更优雅的解决方案,我现在想不出来。
另外,使用MultiIndex.from_product然后重新建立索引的想法是否可行?
任何帮助我们都欢迎!

pieyvz9o

pieyvz9o1#

您可以使用十字merge

(df.drop(columns='metric_b')
   .merge(df.drop(columns='metric_a'), how='cross')
   .rename(columns=lambda x: x.replace('id_', ''))
)

输出:

x  metric_a  y  metric_b
0  a         1  a         2
1  a         1  b        20
2  a         1  c        40
3  b        10  a         2
4  b        10  b        20
5  b        10  c        40
6  c        30  a         2
7  c        30  b        20
8  c        30  c        40

相关问题