我有以下数据:
| Shiver | Shiver - H2O -Multi | Shiver-SHOWME -Multi | Shiver - STARWARS - Multi | Shiver - UFC - Multi | Total | no_of_prize |
|---|---|---|---|---|---|---|
| 3.30 | 46.94 | 14.83 | 10.76 | 0.00 | 575.30 | 3 |
| 4.01 | 21.31 | 21.28 | 10.77 | 0.00 | 568.16 | 3 |
| 1.24 | 0.15 | 0.46 | 0.00 | 0.00 | 482.74 | 2 |
| 0.90 | 0.43 | 0.94 | 0.00 | 0.00 | 128.38 | 2 |
| 2.91 | 2.93 | 0.75 | 0.86 | 0.00 | 265.52 | 3 |
| 0.31 | 8.09 | 4.70 | 0.72 | 0.00 | 117.81 | 3 |
| 0.25 | 0.83 | 2.12 | 0.00 | 0.00 | 55.84 | 2 |
| 0.04 | 2.43 | 1.39 | 1.64 | 0.00 | 457.23 | 3 |
| 5.95 | 12.28 | 4.33 | 5.73 | 0.00 | 540.54 | 3 |
我想将除 Total 和 no_of_prize 以外的列都转换成占 Total 的百分比。列的数量可能因数据而异,因此我想使用正则表达式来识别像 Shiver 和 Shiver - Multi 这样的列。
例如,另一个数据可能如下所示:
| Horror | Horror - FRANKESTIEN - Multi | Total | no_of_prize |
|---|---|---|---|
| 3.30 | 46.94 | 575.30 | 3 |
| 4.01 | 21.31 | 568.16 | 3 |
| ... | ... | ... | ... |
我也希望能够自动处理这种情况,使用正则表达式或任何其他可行的方式。
2、解决方案
我们可以使用以下步骤来解决此问题:
- 使用
columns.difference方法过滤掉不必要的列,即 Total 和no_of_prize。 - 使用
div方法将这些列除以Total列。 - 使用
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)
输出结果如下:
| Shiver | Shiver - H2O -Multi | Shiver-SHOWME -Multi | Shiver - STARWARS - Multi | Shiver - UFC - Multi | Total | no_of_prize |
|---|---|---|---|---|---|---|
| 0.57% | 8.16% | 2.58% | 1.87% | 0.00% | 575.30 | 3 |
| 0.71% | 3.75% | 3.75% | 1.90% | 0.00% | 568.16 | 3 |
| 0.26% | 0.03% | 0.10% | 0.00% | 0.00% | 482.74 | 2 |
| 0.70% | 0.33% | 0.73% | 0.00% | 0.00% | 128.38 | 2 |
| 1.10% | 1.10% | 0.28% | 0.32% | 0.00% | 265.52 | 3 |
| 0.26% | 6.87% | 3.99% | 0.61% | 0.00% | 117.81 | 3 |
| 0.45% | 1.49% | 3.80% | 0.00% | 0.00% | 55.84 | 2 |
| 0.01% | 0.53% | 0.30% | 0.36% | 0.00% | 457.23 | 3 |
| 1.10% | 2.27% | 0.80% | 1.06% | 0.00% | 540.54 | 3 |