如何为Pandas中的每一行生成列“选择”的每种可能组合

时间:2017-09-16 07:03:40

标签: python pandas

我的数据框看起来像这样

      A      B      C
0   0.799  0.137  0.064
1   0.277  0.251  0.471
2   0.294  0.273  0.434
3   0.793  0.138  0.069
4   0.454  0.265  0.281
5   0.079  0.159  0.762
6   0.809  0.135  0.056
7   0.221  0.255  0.523
8   0.147  0.228  0.625
9   0.474  0.263  0.263
10  0.475  0.237  0.288
11  0.455  0.290  0.255
12  0.823  0.128  0.048
13  0.127  0.191  0.682
14  0.191  0.254  0.555
15  0.309  0.291  0.400

我的目标是生成每行中一个选项的所有可能组合的列表。就是这样的结果;

0: A
1: A
2: C
3: B
4: C
5: A

(最少6行,最多16行)

但也只是每个通用组合:

AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA

我还想计算每种组合的总概率。

等。有没有熊猫的方法,或者我应该使用更通用的方法?感谢。

1 个答案:

答案 0 :(得分:1)

import pandas as pd
import numpy as np
from itertools import product

df = pd.DataFrame({"A":np.random.random(16),
                   "B":np.random.random(16),
                   "C":np.random.random(16)})

然后,为了获得所有可能的组合,我们使用产品:

comb_length = 6
combinations = []

for combination in product(["A", "B", "C"], repeat=comb_length):
    combinations.append(dict(enumerate(combination)))

print(len(combinations)) # 729

它保存了所有可能的组合,例如:

print(combinations[350])

{0: 'B', 1: 'B', 2: 'A', 3: 'C', 4: 'C', 5: 'C'}

然后,如果您需要选择相应的数据,您可以:

[df.loc[x, y] for x, y in combinations[350].items()]

输出是组合[350]列(B B A C C C)的值:

[0.11852649572396512,
 0.81183063774252817,
 0.63510644715163156,
 0.17961073510080461,
 0.073763780132310774,
 0.34638485836422905]

350这是一个随机组合编号。

记住comb_length = 16导致3 ^ 16(43毫安)组合,因此你可能会内存不足。