You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环后构建正确DataFrame:列对比值计算问题求助

解决Python DataFrame中生成列对比值的问题

看起来你已经找对了计算比值的方向,但在构建结果DataFrame时的逻辑有点偏差——你现在是把每个比值序列当成了结果里的一行,而我们需要的是把每个比值序列作为结果里的一列。下面给你两种可行的解决方案:

方案一:手动遍历列对,构建新列

这种方式直观易懂,适合刚接触pandas的场景:

  1. 首先分离出所有的A列和对应的B列
  2. 遍历每一对列,计算比值并命名新列
  3. 把新列和原Name列合并成最终的DataFrame
import pandas as pd
import numpy as np

# 假设你的原始DataFrame是df
# 第一步:提取所有A列和对应的B列
a_cols = [col for col in df.columns if col.endswith('A')]
b_cols = [col.replace('A', 'B') for col in a_cols]

# 第二步:初始化结果DataFrame,先保留Name列
result_df = df[['Name']].copy()

# 第三步:遍历每一对列,计算比值并添加到结果中
for a_col, b_col in zip(a_cols, b_cols):
    # 生成新列名,比如"1_ratio"对应1B/1A,也可以用"1B_over_1A"更直观
    ratio_col_name = f"{a_col[:-1]}_ratio"
    # 计算比值:B列除以A列
    result_df[ratio_col_name] = df[b_col] / df[a_col]

# 查看结果
print(result_df)

方案二:用groupby简化操作

如果你的列名都是"XA"和"XB"的固定格式,可以用pandas的groupby按列名前缀分组,自动计算比值,代码更简洁:

# 跳过Name列,按列名的前缀(去掉最后一个A/B字符)分组
grouped = df.iloc[:, 1:].groupby(lambda col: col[:-1], axis=1)

# 对每个分组计算B列除以A列的比值
ratio_df = grouped.apply(lambda x: x.iloc[:, 1] / x.iloc[:, 0])

# 合并Name列和比值列,并重命名新列
final_df = pd.concat([df['Name'], ratio_df], axis=1)
final_df.columns = ['Name'] + [f"{col}_ratio" for col in ratio_df.columns]

print(final_df)

为什么你的原始代码会混乱?

你之前的循环里,每次把一个比值序列(对应原DataFrame的所有行)作为字典的值,然后把这些字典放进列表。当你用pd.DataFrame(l)转换时,pandas会把每个字典当成结果里的一行,而每个比值序列会被拆分成多个列,这就导致了格式混乱。正确的逻辑应该是把每个比值序列作为结果里的一列,而不是一行。

内容的提问来源于stack exchange,提问作者Simone F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:32:47