将字符串的所有字母字符转换为熊猫数据框中单独列中的整数

Posted

技术标签:

【中文标题】将字符串的所有字母字符转换为熊猫数据框中单独列中的整数【英文标题】:Convert all alpha characters of string to integers in separate columns within a pandas dataframe 【发布时间】:2022-01-23 22:30:39 【问题描述】:

我有一列包含字母数字字符的字符串,如下所示:

AA128A AA128B AA128C AA128D AA128E AA129A AA129B AA129C CP100-10 CP100-11 CP100-12 CP100-13 CORSTG11A CORSTG11B CORSTG11C

我想将每个单独的字符分解为单独的列,并将所有字母字符转换为它们的 ASCII 十进制值,并保持数值不变。如果爆炸值后值为null,我想用-1替换它。

我已经能够分解这些值并替换空值,但是当我尝试使用 ord() 函数迭代这些值以转换字母字符时,我得到了错误:

ord() 期望长度为 1 的字符串,但找到了 int

即使我在 for 循环中对数据类型创建条件分析。

import numpy as np 
import pandas as pd 
from sklearn.preprocessing import OrdinalEncoder
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
loc_df = pd.read_csv('C:\\path\\to\\file.csv',index_col=False)
# new data frame with split value columns 
explode_df = loc_df["stoloc"].apply(lambda x: pd.Series(list(x)))
explode_df = explode_df.fillna(-1)
#Convert alpha characters to numeric
for char in explode_df:
    if is_string_dtype(explode_df[char]):
        explode_df_numeric[char] = ord(char)
    else:
        explode_df_numeric[char] = char

expected outcome

【问题讨论】:

怎么会有空值?你是指 NaN 还是 NUL 字符 (\0)? 在这种情况下,我指的是 NaN。它们会存在,因为当分解成单独的列时,并非所有字符串的长度都相同 显示您的代码尝试和期望的结果示例。 我已经添加了这些项目。谢谢你说出来。 【参考方案1】:

出现该错误的原因是变量char 是列名,而这不是ord 的正确参数。您应该改为传递该列中的值;您可以使用applymap

        if is_string_dtype(explode_df[char]):
            explode_df[char] = explode_df[char].apply(ord)
        else:
            explode_df[char] = explode_df[char]

但是您的代码中还有其他问题。对列进行 for 循环并检查列的类型并不能解决问题,因为有些列同时包含字符串和整数。一个简单的解决方案是 applymap 和 is_int 检查:

def is_int(s):
    try: 
        int(s)
        return True
    except:
        return False

# new data frame with split value columns 
explode_df = loc_df["stoloc"].apply(list).apply(pd.Series)
explode_df = explode_df.fillna(-1)
explode_df_numeric = explode_df.applymap(lambda x: x if is_int(x) else ord(x))

【讨论】:

以上是关于将字符串的所有字母字符转换为熊猫数据框中单独列中的整数的主要内容,如果未能解决你的问题,请参考以下文章

将纪元时间转换为熊猫数据框中的格式化日期字符串

将熊猫列中的整数值转换为字符串[重复]

如何将包含列表的列转换为熊猫数据框中的单独列? [复制]

强制熊猫将列中的 (1,2) 解释为字符串而不是范围?

如何从熊猫数据框中的列中删除字符串值

如何从包含特定列中特定字符串的熊猫数据框中删除行? [复制]