我如何获得由 pandas 数据框中的值表示的两个串联代码的总百分比

How do i get an aggregate percentage on two concatenated codes denoted by a value in a pandas dataframe

我是 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 是由“-”分隔的 2 个代码串联而成的字符串。我的 objective 是通过第一个代码找到 alphacombocount 的总百分比。 例如:

其中有21个子码-

Alpha   AlphaComboCount  Percent
21-99   1225             53%
21-141    75             3.2%
21-581  1000            43.3%

上面看到的objective就是得到一个相应的百分比。因为这里的总聚合是 21 个子代码中的 2300 个。

组合代码变得更复杂的地方:

   123-49,121-29,22-79       626  99%
    121-99,123-99,22-99      4   0.6%

正如你在上面看到的,所有第一个子代码都是相同的,但重新排列了。这也是获取百分比值的有效案例。只要组合与'-'之前的第一个子码相同即可。我怎样才能得到所有 alpha 组合的百分比值?有算法吗?

首先,你想把一个单元格内的代码分开,那么你可以提取第一个代码和groupby:

# 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, 123, 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,121-29,22-79              626     121
15  121-99,123-99,22-99                4     121

计算每个组中 AlphaComboCount 的百分比(使用 Alpha_1) 的特定值,定义以下函数:

def proc(grp):
    return (grp.AlphaComboCount / grp.AlphaComboCount.sum()
        * 100).apply('{0:.2f}%'.format)

Group df by Alpha_1 并应用这个函数,保存结果 在 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,121-29,22-79              626     121   23.70%
15  121-99,123-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.

的预期结果