繁体   English   中英

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

[英]Python Pandas - Column - All possible combination

我有一个包含2列( NameScore )的数据集,我想将Name列分为2组: group 1group 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

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

第二次互动的示例:

   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

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

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

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

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

然后,您将这些二进制表示形式转换为comb_boolscomb_bools )列表,以允许它们传递到数据comb_boolscomb_bools表示,group2由not(comb_bools)

获得这些列表后,您可以轻松计算所需的值并将其存储在列表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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM