如何对pandas DataFrame中相同前缀的列执行两两相除操作
可以用单行代码实现,适配任意数量相同前缀的列,不需要提前指定前缀名称:
result = df.groupby(df.columns.str.split('_').str[0], axis=1).apply(lambda g: g.iloc[:, 0] / g.iloc[:, 1])
代码逻辑说明
- 先用
df.columns.str.split('_').str[0]提取所有列名的前缀(也就是示例中的x、y) - 按前缀对列做分组,相同前缀的
*_A和*_B会被分到同一组 - 每组内直接用第一列(_A后缀的分子列)除以第二列(_B后缀的分母列),最终输出的DataFrame列名自动为对应的前缀
如果你的列顺序不固定,怕搞混分子分母,可以用更严谨的写法,明确指定取_A列除以_B列:
result = df.groupby(df.columns.str.split('_').str[0], axis=1).apply(lambda g: g.filter(like='_A').squeeze() / g.filter(like='_B').squeeze())
如果你需要的是1/9这类字符串格式的结果,而不是数值计算结果,可以用下面的写法:
result = pd.DataFrame({pre: df[f"{pre}_A"].astype(str) + "/" + df[f"{pre}_B"].astype(str) for pre in df.columns.str.split('_').str[0].unique()})
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

