如何利用Pandas自动识别并移除列名的可变公共前缀与后缀(财务系统数据导入场景)
解决方案:自动移除Pandas列名的可变公共前缀/前后缀
太棒的问题了!从财务系统导入数据时,列名带可变公共前缀(甚至前后缀)确实是个常见的麻烦事。我来给你拆解两种场景的解决方案:
场景1:仅存在可变公共前缀
当列名只有可变的公共前缀时,核心思路是先找出所有列名的最长公共前缀,再批量移除这个前缀。
具体实现
- 先写一个工具函数,用来计算一组字符串的最长公共前缀;
- 提取DataFrame的列名列表,用这个工具函数拿到公共前缀;
- 用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的前缀函数,再写一个工具函数计算最长公共后缀(其实就是把字符串反转后找前缀,再反转回来);
- 分别提取出前缀和后缀;
- 先删前缀,再删后缀(顺序其实不影响,但逻辑上先处理前后更清晰)。
完整代码示例
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
相关产品推荐
相关产品推荐

