Python Pandas-专栏-所有可能的组合

时间:2018-08-22 13:13:47

标签: python pandas combinations

我有一个包含2列(NameScore)的数据集,我想将列Name分为2组:group 1和{{1} }。然后,我将不得不计算group 2。我的目标是在名称和组的所有组合中找到最小的sum(score group 1) / sum(score group 2)

sum(score group 1) / sum(score group 2)

第一次互动的示例:

df = pd.DataFrame({
    'Name': list('ABCDEF'),
    'Score': [600, 1000, 300, 100, -100, 3000],
}, columns=['Name', 'Score'])

df

  Name  Score
0    A    600
1    B   1000
2    C    300
3    D    100
4    E   -100
5    F   3000

Group Name Score 0 1 A 600 1 2 B 1000 2 2 C 300 3 2 D 100 4 2 E -100 5 2 F 3000 = 0.1395

第二次互动的示例:

sum(score group 1) / sum(score group 2)

Group Name Score 0 1 A 600 1 1 B 1000 2 2 C 300 3 2 D 100 4 2 E -100 5 2 F 3000 = 0.4848

然后,计算所有组合的分数并获得最小的sum(score group 1) / sum(score group 2)

1 个答案:

答案 0 :(得分:0)

我已经更新了解决方案,因此与您的示例保持一致。

基本上,可以从12**(len(df.index)) - 1范围内的所有数字的二进制表示形式生成组的所有可能组合。

然后,您将这些二进制表示形式转换为bool(comb_bools)列表,以允许将它们传递到数据框-group1用comb_bools表示,group2用not(comb_bools)表示。 / p>

有了这些列表后,您可以轻松计算所需的值并将其存储在列表result中。

import pandas as pd
import numpy as np

df = pd.DataFrame({'Name': list('ABCDEF'),
                   'Score': [600, 1000, 300, 100, -100, 3000],}, 
                   columns=['Name', 'Score'])

nb_combs = 2**len(df.index) - 1
group1 = []
group2 = []
result = []

for i in range(1, nb_combs):
    comb = list(map(int, list(format(i, '0' + str(len(df.index)) + 'b'))))
    comb_bools = list(map(bool, comb))

    group1.append(df[comb_bools]['Name'].values)
    group2.append(df[[not(j) for j in comb_bools]]['Name'].values)

    numerator = sum(df[df['Name'].isin(group1[i - 1])]['Score'].values)
    denominator = sum(df[df['Name'].isin(group2[i - 1])]['Score'].values)

    result.append(numerator / denominator)

min_idx = np.argmin(result)
print('Minimum value: {}'.format(result[min_idx]))
print('Corresponding Group1: {}'.format(group1[min_idx]))
print('Corresponding Group2: {}\n'.format(group2[min_idx]))

输出:

Minimum value: -50.0
Corresponding Group1: ['A' 'B' 'C' 'D' 'F']
Corresponding Group2: ['E']