如何在python中识别string和alphnumeric string?

2024-05-12 17:39:49 发布

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

Df1:
  Name    Emp_Id   Desgn  Salary
0 Rick    F912-1   Engg    4500
1 Monty   56Df1    Doc     6700
2 Chris   J45-12   Arch2   7800.0
3 Julie   Klgi     Engg-A  KL00
4 Mashy1  5670     Law_y   4100.0

Df2:

COL_NAME   DATATYPE
Name       string
EMP_Id     AlphaNum
Design     string
Salary     Floatorint 

如何在dataframe上循环检查值datatype是否有效? 我想检查每个列的值数据类型是否与df2数据类型信息有关,并返回false数据类型值。对于示例字符串列应包含字符串(无数字),字母数字数据类型必须是至少1个数字和1个字母的组合。你知道吗

输出:

Col_name  value    dtype   Row_Num
Name       Mashy1  string     4
Emp_Id     Klgi    AlphaNum   3
Emp_Id     5670    AlphaNum   4
Design     Arch2   string     2
Salary     KL00    Floatorint 3

Tags: nameidstring数字design数据类型salaryemp
2条回答

这里有一个正则表达式的解决方案。 首先,创建regex模式并将预编译regex对象的“match”方法放入df2:

import re

rnum= r"^(?=^\d*.?\d*$)[\d\.]+$"
ralpha= r"(?i)^(?=.*[-_a-z])(?=.*\d)[-_a-z\d]+$"
rstr= r"(?i)^[-_a-z]+$"

df2["rx"]=df2.DATATYPE.replace({"string":re.compile(rstr).match, \
                                "AlphaNum":re.compile(ralpha).match, \
                                "Floatorint":re.compile(rnum).match})

然后从它们中创建一个dict并将其用于转换df1:

d= dict(df2[["COL_NAME","rx"]].values)
r= df1[df1.transform(d).isna()]

    Name Emp_Id Design Salary
0     NaN    NaN    NaN    NaN
1     NaN    NaN    NaN    NaN
2     NaN    NaN  Arch2    NaN
3     NaN   Klgi    NaN   KL00
4  Mashy1   5670    NaN    NaN

格式匹配,并添加“数据类型”列:

r= r.stack().rename_axis(index=["row_num","col_name"]).reset_index(name="value")
r["data_type"]= df2.set_index("COL_NAME").loc[r.col_name,"DATATYPE"].values   
r= r.reindex(columns=["col_name","value","data_type","row_num"])

  col_name   value   data_type  row_num
0   Design   Arch2      string        2
1   Emp_Id    Klgi    AlphaNum        3
2   Salary    KL00  Floatorint        3
3     Name  Mashy1      string        4
4   Emp_Id    5670    AlphaNum        4 

注意:您也可以在df2.rx中使用非regex函数。你知道吗

虽然可以使用regex解决这个问题,但我选择了Python解决方案,借用了here。你知道吗

首先是一个helper函数,用于确定字符串是否包含数字。你知道吗

def hasNumbers(inputString):
    return any(char.isdigit() for char in inputString)

第二,一个将对象分类为指定类型的函数。你知道吗

def determine_type(x):
    # check if x is a number
    if isinstance(x, (int, float, np.int64, np.float64)):
        return "int or float"

    # check if x is a string
    elif isinstance(x, str):
        # check if the string contains a digit
        if hasNumbers(x):
            return "alphanumeric"
        else:
            # it's a string
            return "string"

注意这里的边缘情况,intfloat被转换成字符串。”5”是字母数字。你知道吗

让我们做一个数据帧,把任何可以转换成数字的东西,转换成一个数字:

"""
  name    emp_id   design  salary
0 Rick    F912-1   Engg    4500
1 Monty   56Df1    Doc     6700
2 Chris   J45-12   Arch2   7800.0
3 Julie   Klgi     Engg-A  KL00
4 Mashy1  5670     Law_y   4100.0
"""
df1 = pd.read_clipboard().reset_index(drop=True)
df1 = df1.applymap(lambda x: pd.to_numeric(x, errors="ignore"))

display(df1)

输出:

     name  emp_id  design salary
0    Rick  F912-1    Engg   4500
1   Monty   56Df1     Doc   6700
2   Chris  J45-12   Arch2   7800
3   Julie    Klgi  Engg-A   KL00
4  Mashy1    5670   Law_y   4100

现在,让我们melt将这个数据帧转换成您请求的格式,并应用我们的自定义函数。你知道吗

# melt the df
df1_melted = df1.reset_index().melt(id_vars="index").sort_values("index")

# apply our function
df1_melted["type"] = df1_melted["value"].apply(determine_type)
print(df1_melted.head(10))

输出:

    index variable   value          type
0       0     name    Rick        string
5       0   emp_id  F912-1  alphanumeric
10      0   design    Engg        string
15      0   salary    4500  int or float
1       1     name   Monty        string
6       1   emp_id   56Df1  alphanumeric
11      1   design     Doc        string
16      1   salary    6700  int or float
2       2     name   Chris        string
17      2   salary    7800  int or float

这里的大部分工作是编写(破解)一个自定义函数来确定数据类型。我真的建议坚持使用内置类型,无论是纯Python还是numpy。如果某个东西是字符串,那么你可以做进一步的分析。你知道吗

相关问题 更多 >