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

如何利用Pandas自动识别并移除列名的可变公共前缀与后缀(财务系统数据导入场景)

解决方案:自动移除Pandas列名的可变公共前缀/前后缀

太棒的问题了!从财务系统导入数据时,列名带可变公共前缀(甚至前后缀)确实是个常见的麻烦事。我来给你拆解两种场景的解决方案:


场景1:仅存在可变公共前缀

当列名只有可变的公共前缀时,核心思路是先找出所有列名的最长公共前缀,再批量移除这个前缀。

具体实现

  1. 先写一个工具函数,用来计算一组字符串的最长公共前缀;
  2. 提取DataFrame的列名列表,用这个工具函数拿到公共前缀;
  3. 用Pandas的str.replace批量把前缀从列名里删掉。

完整代码示例

import pandas as pd
import numpy as np
from itertools import takewhile

def get_longest_common_prefix(str_list):
    """计算字符串列表的最长公共前缀"""
    if not str_list:
        return ""
    # 按字符位置把所有字符串分组,直到出现不同字符为止
    return ''.join(c[0] for c in takewhile(lambda x: all(x[0] == y for y in x), zip(*str_list)))

# 生成你提供的示例数据
cols = ["abc_W1", "abc_X2", "abc_Y3", "abc_Z4"]
data = np.random.randint(low=1, high=10, size=(4,4))
df = pd.DataFrame(data=data, columns=cols)

# 获取公共前缀并移除
common_prefix = get_longest_common_prefix(df.columns.tolist())
df.columns = df.columns.str.replace(f"^{common_prefix}", "", regex=True)

print(df)

运行后,列名就会变成W1、X2、Y3、Z4,完全符合你的预期。


场景2:同时存在公共前缀和后缀

如果列名同时带可变的公共前缀和后缀,我们需要分别找出最长公共前缀和最长公共后缀,再依次把两者都移除。

具体实现

  1. 复用场景1的前缀函数,再写一个工具函数计算最长公共后缀(其实就是把字符串反转后找前缀,再反转回来);
  2. 分别提取出前缀和后缀;
  3. 先删前缀,再删后缀(顺序其实不影响,但逻辑上先处理前后更清晰)。

完整代码示例

import pandas as pd
import numpy as np
from itertools import takewhile

def get_longest_common_prefix(str_list):
    """计算字符串列表的最长公共前缀"""
    if not str_list:
        return ""
    return ''.join(c[0] for c in takewhile(lambda x: all(x[0] == y for y in x), zip(*str_list)))

def get_longest_common_suffix(str_list):
    """计算字符串列表的最长公共后缀"""
    if not str_list:
        return ""
    # 反转每个字符串,找最长公共前缀后再反转回来
    reversed_strings = [s[::-1] for s in str_list]
    reversed_prefix = get_longest_common_prefix(reversed_strings)
    return reversed_prefix[::-1]

# 生成带前后缀的示例数据
cols = ["abc_W1_foo", "abc_X2_foo", "abc_Y3_foo", "abc_Z4_foo"]
data = np.random.randint(low=1, high=10, size=(4,4))
df = pd.DataFrame(data=data, columns=cols)

# 获取公共前缀和后缀并移除
common_prefix = get_longest_common_prefix(df.columns.tolist())
common_suffix = get_longest_common_suffix(df.columns.tolist())

df.columns = df.columns.str.replace(f"^{common_prefix}", "", regex=True)\
                       .str.replace(f"{common_suffix}$", "", regex=True)

print(df)

这段代码会自动识别出前缀abc_和后缀_foo,移除后得到干净的列名W1、X2、Y3、Z4。


额外小贴士

  • 边界情况兼容:如果你的列名没有公共前缀/后缀,工具函数会返回空字符串,str.replace不会对列名做任何修改,完全不用担心出错;
  • 分隔符适配:不管前缀后缀用的是下划线_还是其他分隔符,只要是所有列名共有的部分,都会被正确识别并移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:18:12