模糊CSV列匹配

1 投票
1 回答
1029 浏览
提问于 2025-04-18 17:22

我现在正在处理很多 .csv 文件,遇到了一些问题。比如,一个 .csv 文件里有一列是候选人的名字,列的标题叫 candidate_name,而另一个文件里同样的列却叫 CANDIDATE_FULL_NAME

我在更新字典的时候,会根据这些列的结果来做,但每次都得为不同的标题不断地修改行的值,真是麻烦。

dict.update({
    'candidate': row['column_header']

有没有什么办法可以模糊匹配这些标题?最好是那种几乎可以直接用的,这样我就不需要自己写一个类或者方法去用正则表达式测试每一列的相似性了。

我已经写了一个类,用来测试一个值是否和一组值匹配,但我觉得这应该有现成的解决方案。可惜我在网上搜索的时候没有找到相关的信息。

我本来想用列的编号来处理,但问题是列的顺序并不总是一样。此外,我也不能修改原始的 .csv 文件(要不然我肯定会把它们统一格式化)。

1 个回答

1

据我所知,pandas里没有内置的“模糊”匹配功能。如果有一些共同的特征,比如“名字”这个词总是出现在包含候选人名字的那一列,你可以利用这个特征来重命名名字那一列。比如:

import pandas as pd
import numpy as np

def fuzzymatch(df, string, stname):

    for col in df.columns:
        if col.lower().find(string) > -1:
            df.rename(columns={col:stname}, inplace=True)
            break

    return df

df = pd.DataFrame({"CANDIDATE_NAME_HERE": ["Ted","Fred","Sally","John","Jane"], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
#pd.read_csv('filename.csv') will load your csv file

string = 'name'
stname = 'candidate_name'

df = fuzzymatch(df, string, stname)
print(df)

    B      C candidate_name
0  20     32            Ted
1  30    234           Fred
2  10     23          Sally
3  40     23           John
4  50  42523           Jane

撰写回答