将符合正则表达式的列按比例转换成百分比

32 阅读1分钟

我有以下数据:

ShiverShiver - H2O -MultiShiver-SHOWME -MultiShiver - STARWARS - MultiShiver - UFC - MultiTotalno_of_prize
3.3046.9414.8310.760.00575.303
4.0121.3121.2810.770.00568.163
1.240.150.460.000.00482.742
0.900.430.940.000.00128.382
2.912.930.750.860.00265.523
0.318.094.700.720.00117.813
0.250.832.120.000.0055.842
0.042.431.391.640.00457.233
5.9512.284.335.730.00540.543

我想将除 Total 和 no_of_prize 以外的列都转换成占 Total 的百分比。列的数量可能因数据而异,因此我想使用正则表达式来识别像 Shiver 和 Shiver - Multi 这样的列。

例如,另一个数据可能如下所示:

HorrorHorror - FRANKESTIEN - MultiTotalno_of_prize
3.3046.94575.303
4.0121.31568.163
............

我也希望能够自动处理这种情况,使用正则表达式或任何其他可行的方式。

2、解决方案

我们可以使用以下步骤来解决此问题:

  1. 使用 columns.difference 方法过滤掉不必要的列,即 Total 和 no_of_prize
  2. 使用 div 方法将这些列除以 Total 列。
  3. 使用 mul 方法将结果乘以 100 以得到百分比。

以下是实现这些步骤的 Python 代码:

import pandas as pd

df = pd.DataFrame({
    "Shiver": [3.30, 4.01, 1.24, 0.90, 2.91, 0.31, 0.25, 0.04, 5.95],
    "Shiver - H2O -Multi": [46.94, 21.31, 0.15, 0.43, 2.93, 8.09, 0.83, 2.43, 12.28],
    "Shiver-SHOWME -Multi": [14.83, 21.28, 0.46, 0.94, 0.75, 4.70, 2.12, 1.39, 4.33],
    "Shiver - STARWARS - Multi": [10.76, 10.77, 0.00, 0.00, 0.86, 0.72, 0.00, 1.64, 5.73],
    "Shiver - UFC - Multi": [0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00],
    "Total": [575.30, 568.16, 482.74, 128.38, 265.52, 117.81, 55.84, 457.23, 540.54],
    "no_of_prize": [3, 3, 2, 2, 3, 3, 2, 3, 3]
})

# 过滤掉不必要的列
cols = df.columns.difference(['Total', 'no_of_prize'])

# 将列除以 Total 列
df[cols] = df[cols].div(df['Total'], axis=0)

# 将结果乘以 100 以得到百分比
df[cols] = df[cols].mul(100)

# 将结果四舍五入到小数点后两位
df[cols] = df[cols].round(2)

# 将结果转换为字符串并添加百分号
df[cols] = df[cols].astype(str) + '%'

print(df)

输出结果如下:

ShiverShiver - H2O -MultiShiver-SHOWME -MultiShiver - STARWARS - MultiShiver - UFC - MultiTotalno_of_prize
0.57%8.16%2.58%1.87%0.00%575.303
0.71%3.75%3.75%1.90%0.00%568.163
0.26%0.03%0.10%0.00%0.00%482.742
0.70%0.33%0.73%0.00%0.00%128.382
1.10%1.10%0.28%0.32%0.00%265.523
0.26%6.87%3.99%0.61%0.00%117.813
0.45%1.49%3.80%0.00%0.00%55.842
0.01%0.53%0.30%0.36%0.00%457.233
1.10%2.27%0.80%1.06%0.00%540.543