如何解决如何在熊猫数据框中用值表示的两个串联代码获得合计百分比
是python的新手,试图理解数据操作
df
Alpha AlphaComboCount
12-99 8039
22-99 1792
12-99,138-99 1776
12-45,138-45 1585
21-99 1225
123-99 1145
121-99 1102
21-581 1000
121-99,22-99 909
32-99 814
21-141 75
12-581,12-99 711
347-99 685
2089-281 685
123-49,121-29,22-79 626
121-99,123-99,22-99 4
如您在上面看到的,有两列。 Alpha是由两个以“-”分隔的代码串联而成的字符串。我的目标是通过第一个代码找到alphacombocount的总百分比。 例如:
有21个子代码-
Alpha AlphaComboCount Percent
21-99 1225 53%
21-141 75 3.2%
21-581 1000 43.3%
如上所示,目标是获得相应的百分比。因为这里的总聚集是21个子代码中的2300。
更复杂的地方是组合代码:
123-49,22-79 626 99%
121-99,22-99 4 0.6%
如您在上面看到的,所有第一个子代码都是相同的,但已重新排列。这也是获取百分比值的有效情况。只要组合与“-”之前的第一个子代码相同。我该如何获取所有alpha组合的百分比值?有这个算法吗?
解决方法
首先,您要在一个单元格中分离代码,然后可以提取第一个代码并进行分组:
# separate the codes
tmp = df.assign(FirstCode=df.Alpha.str.split(','))
# extract the first code
tmp['FirstCode'] = [tuple(sorted(set(x.split('-')[0] for x in cell)))
for cell in tmp.FirstCode]
# sum per each first codes with groupby
sum_per_code = tmp['AlphaComboCount'].groupby(tmp['FirstCode']).transform('sum')
# percentage is just a simple division
tmp['Percent'] = tmp['AlphaComboCount']/sum_per_code
# let's print the output:
print(tmp.sort_values('FirstCode'))
输出:
Alpha AlphaComboCount FirstCode Percent
0 12-99 8039 (12,) 0.918743
11 12-581,12-99 711 (12,) 0.081257
2 12-99,138-99 1776 (12,138) 0.528414
3 12-45,138-45 1585 (12,138) 0.471586
6 121-99 1102 (121,) 1.000000
14 123-49,121-29,22-79 626 (121,123,22) 0.993651
15 121-99,123-99,22-99 4 (121,22) 0.006349
8 121-99,22-99 909 (121,22) 1.000000
5 123-99 1145 (123,) 1.000000
13 2089-281 685 (2089,) 1.000000
4 21-99 1225 (21,) 0.532609
7 21-581 1000 (21,) 0.434783
10 21-141 75 (21,) 0.032609
1 22-99 1792 (22,) 1.000000
9 32-99 814 (32,) 1.000000
12 347-99 685 (347,) 1.000000
,
如果 Alpha 列中有许多代码(以不同的顺序), 那么可能的解决方案之一就是提取其中一种(例如最少), 然后加入“-”之前的部分,将其保存在新列中,并在后续步骤中使用 处理中:
df['Alpha_1'] = df.Alpha.str.split(',')\
.apply(lambda lst: min(lst)).str.split('-',expand=True)[0]
结果是:
Alpha AlphaComboCount Alpha_1
0 12-99 8039 12
1 22-99 1792 22
2 12-99,138-99 1776 12
3 12-45,138-45 1585 12
4 21-99 1225 21
5 123-99 1145 123
6 121-99 1102 121
7 21-581 1000 21
8 121-99,22-99 909 121
9 32-99 814 32
10 21-141 75 21
11 12-581,12-99 711 12
12 347-99 685 347
13 2089-281 685 2089
14 123-49,22-79 626 121
15 121-99,22-99 4 121
计算每个组中 AlphaComboCount 的百分比( Alpha_1 的特定值),定义以下函数:
def proc(grp):
return (grp.AlphaComboCount / grp.AlphaComboCount.sum()
* 100).apply('{0:.2f}%'.format)
按 Alpha_1 将 df 分组并应用此功能,保存结果 在 Grp_pct 列中:
df['Grp_pct'] = df.groupby('Alpha_1').apply(proc).reset_index(level=0,drop=True)
要轻松检查结果,将每个组中的行放在一起, 通过以下方式打印 df :
print(df.sort_values('Alpha_1'))
获取:
Alpha AlphaComboCount Alpha_1 Grp_pct
0 12-99 8039 12 66.38%
2 12-99,138-99 1776 12 14.66%
3 12-45,138-45 1585 12 13.09%
11 12-581,12-99 711 12 5.87%
6 121-99 1102 121 41.73%
8 121-99,22-99 909 121 34.42%
14 123-49,22-79 626 121 23.70%
15 121-99,22-99 4 121 0.15%
5 123-99 1145 123 100.00%
13 2089-281 685 2089 100.00%
4 21-99 1225 21 53.26%
7 21-581 1000 21 43.48%
10 21-141 75 21 3.26%
1 22-99 1792 22 100.00%
9 32-99 814 32 100.00%
12 347-99 685 347 100.00%
现在,例如将有关 Alpha_1 == 21 的部分与 您对子代码 21 的预期结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。