将包含字母数字数据的列与另一数据帧的同一列进行比较

2024-10-03 00:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须比较具有相同列的2个数据帧,但行数可能不相等。我的问题是其中一列包含一些输入错误,如“KVA 2048/20-21”、“KVA2048/20”带空格和不带空格,“033”、“33”我编写了一个小函数来解决比较问题,但从pandas到python循环,2000行数据帧比较大约需要5分钟。熊猫有什么希望吗

我的职能:

def inv_no_match(val1, val2):
    if val1 != val2:
        if type(val1) == type(val2) == str:
            val1 = val1.replace(" ", "").replace('\r', "").replace('\n', "")
            val2 = val2.replace(" ", "").replace('\r', "").replace('\n', "")
            if val1 != val2:
                try:
                    val1 = int(val1)
                    val2 = int(val2)
                except:
                    pass
                if val1 != val2:
                    return False
                else:
                    return True
            else:

                return True
        else:
            return True
    else:
        return True

Tags: 数据函数truereturniftype错误else
1条回答
网友
1楼 · 发布于 2024-10-03 00:26:31

假设您有两个数据帧:

df1 = pd.DataFrame({'col1': ['KVA 2048/20-21', 'KVA2049/20-21', 'KVA 2050/20-21\n', 'KVA2048/20-21']})
df2 = pd.DataFrame({'col1': ['KVA2048/20-21', 'KVA2050/20-21']})

印刷品:

               col1
0    KVA 2048/20-21
1     KVA2049/20-21
2  KVA 2050/20-21\n
3     KVA2048/20-21
            col1
0  KVA2048/20-21
1  KVA2050/20-21

然后,您可以先清洁色谱柱:

def clean_column(x):
    x = x.replace(" ", "").replace('\r', "").replace('\n', "")
    return x

df1['col1'] = df1['col1'].apply(clean_column)
df2['col1'] = df2['col1'].apply(clean_column)

然后做.merge()

print( df1.merge(df2, on='col1') )

印刷品:

            col1
0  KVA2048/20-21
1  KVA2048/20-21
2  KVA2050/20-21

注意:例如,如果要在第一个数字上进行合并,请相应地修改clean_column函数:

import re

def clean_column(x):
    first_num = re.search(r'(\d+)', x)
    if first_num:
        return int(first_num.group(1))
    else:
        return np.nan

df1['tmp'] = df1['col1'].apply(clean_column)
df2['tmp'] = df2['col1'].apply(clean_column)

print( df1.merge(df2, on='tmp') )

相关问题 更多 >