【问题标题】:Python Pandas - Column - All possible combinationPython Pandas - 列 - 所有可能的组合
【发布时间】:2018-08-22 13:13:47
【问题描述】:

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

【问题讨论】:

  • 最小的是 -100 /(所有其他的总和)。这是你需要的吗?
  • 我很困惑,我不明白你想要什么。鉴于您已经提供的输入,您能否提供您的期望?
  • 两个组应该包含多少行?我的意思是有最大或最小数字吗?
  • @gabriel 请将任何示例输出作为edit - cmets 真的不适合它...
  • 每组人数相同?或者 group1 可以有一个值,而另一个组中有 5 个?

标签: python pandas combinations


【解决方案1】:

我已经更新了我的解决方案,使其符合您的示例。

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

然后您将这些二进制表示转换为布尔列表 (comb_bools) 以允许将它们传递到您的数据帧 - group1 由 comb_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']

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 2017-09-06
    • 2019-02-13
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多