Python循环后构建正确DataFrame:列对比值计算问题求助
解决Python DataFrame中生成列对比值的问题
看起来你已经找对了计算比值的方向,但在构建结果DataFrame时的逻辑有点偏差——你现在是把每个比值序列当成了结果里的一行,而我们需要的是把每个比值序列作为结果里的一列。下面给你两种可行的解决方案:
方案一:手动遍历列对,构建新列
这种方式直观易懂,适合刚接触pandas的场景:
- 首先分离出所有的A列和对应的B列
- 遍历每一对列,计算比值并命名新列
- 把新列和原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
相关产品推荐
相关产品推荐

