使用 Python 识别包含特定字符串的单元格并用数字覆盖内容

Identify cells containing specific strings and overwrite content with numbers using Python

我有一个如下所示的数据框:

我的目标是识别每列的每个单元格是否包含以下字符串:'KSS''ABC''DEF''ABC / DEF''KSS / DEF'

随后我想用以下值替换内容:'KSS' -> 100,'ABC' -> 200,'DEF' -> 300,'ABC / DEF' -> 400,'KSS / DEF' -> 500

输出应该是这样的:

注意:该算法应该是通用的并且检查每一列,而不仅仅是数字 3。为了完整起见,数据类型都是 objects.

到目前为止我的代码行是这些,但我想它们是不完整的...

import pandas as pd
import numpy as np  
df = pd.DataFrame([
        ['XYZ', 'BALSO', 'PISCO', 'KSS', 'Yes', 660, 'Cop'],
        ['XYZ', 'TONTO', 'LOLLO', '195', 500, 'Yes', 'nan'],
        ['XYZ', 'CALLO', 'WANDA', 'ABC / DEF', 'Yes', 500, 'nan'],
        ['XYZ', 'AZUNGO', 'FINGI', 'KSS / DEF', 'Yes', 500, 'nan']
    ])
df = pd.read_csv('prova.csv', sep=',', skiprows=0, header=None, low_memory=False)
df.str.replace('KSS|ABC|DEF','?')

如果您使用查找值和替换值创建一个字典,那么您可以在此列上调用 map,另外您需要将 na_action='ignore' 传递给 map,否则您会得到一个 KeyError 对于缺失值,另外你会注意到,因为你有缺失值,这些值会转换为 float 但你可以稍后使用 astype(int) 再次转换:

In [182]:
d={'KSS':100, 'ABC' :200, 'DEF' : 300, 'ABC / DEF' : 400, 'KSS / DEF' : 500}
df[3] = df[3].map(d, na_action='ignore')
df

Out[182]:
     0       1      2      3    4    5
0  XYZ   BALSO  PISCO 100.00  660  Cop
1  XYZ   TONTO  LOLLO    nan  500  nan
2  XYZ   CALLO  WANDA 400.00  500  nan
3  XYZ  AZUNGO  FINGI 500.00  500  nan

这里我们使用 astype:

转换类型
In [178]:
df[3] = df[3].astype(int)
df

Out[178]:
     0       1      2    3    4    5
0  XYZ   BALSO  PISCO  100  660  Cop
1  XYZ   TONTO  LOLLO  195  500  nan
2  XYZ   CALLO  WANDA  400  500  nan
3  XYZ  AZUNGO  FINGI  500  500  nan