如何在Pandas中实现DataFrame值除以首行值且不修改首行并保留两位小数?
解决方案:保留首行并计算其余行的占比
要实现你的需求,核心思路是只对首行以外的行进行运算,同时确保结果保留两位小数。下面提供几种简洁的实现方式:
方法1:直接使用行索引操作(最直观)
这种方式直接定位首行和其他行,计算后合并,逻辑清晰:
import pandas as pd import numpy as np # 你的原始DataFrame df1 = pd.DataFrame(np.array([[200,200],[40,40],[80,80],[80,80]]), columns= ["Erkek","Kadin"], index=["Base","AB","C1","C2"]) # 1. 提取首行(Base行),保留原始值 base_row = df1.iloc[0:1] # 2. 对其余行计算:每行除以首行对应列的值,乘以100转为百分比,保留两位小数 calculated_rows = df1.iloc[1:].div(base_row.iloc[0], axis=1) * 100 calculated_rows = calculated_rows.round(2) # 3. 合并首行和计算后的行 result_df = pd.concat([base_row, calculated_rows]) # 如果需要让首行也显示为两位小数(比如200.00),可以统一格式化 result_df = result_df.round(2)
方法2:使用apply自定义函数(更灵活)
如果需要复用逻辑,可以写一个自定义函数,针对每一列处理首行和其他行:
def calculate_percentage(col): # 首行保持不变,其余行除以首行对应值并转为百分比 col.iloc[1:] = (col.iloc[1:] / col.iloc[0]) * 100 # 保留两位小数 return col.round(2) # 应用函数到每一列 result_df = df1.apply(calculate_percentage)
方法3:一行代码完成(高效简洁)
利用Pandas的广播特性,直接对非首行进行运算:
df1.iloc[1:] = (df1.iloc[1:] / df1.iloc[0]) * 100 result_df = df1.round(2)
最终效果
执行后你的DataFrame会变成:
| Erkek | Kadin | |
|---|---|---|
| Base | 200.00 | 200.00 |
| AB | 40.00 | 40.00 |
| C1 | 80.00 | 80.00 |
| C2 | 80.00 | 80.00 |
如果不需要转为百分比(比如你要的是0.40而非40.00),只需要去掉* 100即可。
内容的提问来源于stack exchange,提问作者Hüseyin
相关产品推荐
相关产品推荐

