如何用Pandas遍历DataFrame列计算城市人口占所属国百分比
解决方法
你的代码核心问题是用了低效的嵌套循环,且没利用Pandas的矢量化操作(这是Pandas的核心优势,比逐行循环高效且逻辑清晰)。另外需要先明确提取固定的国家总人口,再分别计算对应城市类别的占比。
修正步骤
- 读取并清理数据:把带逗号的人口字符串转为数值类型,确保能正常计算。
- 提取固定国家人口:所有A类城市属于A国,所有B类城市属于B国,直接从数据中取出两国的总人口值。
- 矢量化计算占比:直接对整列做运算,无需逐行遍历。
- 新增结果列:把计算好的占比列添加到原数据中。
完整代码
import pandas as pd # 读取Excel数据,列名需和你的Excel实际列名对应 df = pd.read_excel("population.xlsx", usecols=['国家', '国家人口', 'A类城市', 'A类城市人口', 'B类城市', 'B类城市人口']) # 清理数据:去除人口数值中的逗号,转为浮点型 df['国家人口'] = df['国家人口'].str.replace(',', '').astype(float) df['A类城市人口'] = df['A类城市人口'].str.replace(',', '').astype(float) df['B类城市人口'] = df['B类城市人口'].str.replace(',', '').astype(float) # 提取A国和B国的总人口(从非空行中获取) a_country_pop = df.loc[df['国家'] == 'A国', '国家人口'].values[0] b_country_pop = df.loc[df['国家'] == 'B国', '国家人口'].values[0] # 计算占比并保留两位小数 df['A类占比%'] = (df['A类城市人口'] / a_country_pop * 100).round(2) df['B类占比%'] = (df['B类城市人口'] / b_country_pop * 100).round(2) # 查看结果 print(df) # 如需保存回Excel,取消下面注释 # df.to_excel("population_with_ratio.xlsx", index=False)
代码说明
- 数据清理:原数据里的人口是带逗号的字符串(如
100,000),必须转成数值才能做除法运算。 - 提取国家人口:用
loc精准定位到对应国家的行,直接取出总人口值,避免循环判断。 - 矢量化运算:直接对整列进行计算,比逐行循环效率高数倍,逻辑也更直观。
- 结果格式化:用
round(2)保留两位小数,和你期望的输出格式完全匹配。
最终输出
运行代码后,原表格会新增A类占比%和B类占比%列,结果如下:
| 国家 | 国家人口 | A类城市 | A类城市人口 | B类城市 | B类城市人口 | A类占比% | B类占比% |
|---|---|---|---|---|---|---|---|
| A国 | 100000.0 | C市 | 20000.0 | G市 | 10000.0 | 20.0 | 8.33 |
| B国 | 120000.0 | D市 | 15000.0 | H市 | 25000.0 | 15.0 | 20.83 |
| NaN | E市 | 5000.0 | I市 | 45000.0 | 5.0 | 37.5 | |
| NaN | F市 | 60000.0 | J市 | 30000.0 | 60.0 | 25.0 |
内容的提问来源于stack exchange,提问作者alexm
相关产品推荐
相关产品推荐

