如何在熊猫数据框中用值表示的两个串联代码获得合计百分比

如何解决如何在熊猫数据框中用值表示的两个串联代码获得合计百分比

是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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?