我有一个包含2列(Name
和Score
)的数据集,我想将列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)
答案 0 :(得分:0)
我已经更新了解决方案,因此与您的示例保持一致。
基本上,可以从1
到2**(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']