从 Pandas 的字符串列中删除非 ASCII 字符

Joo*_*Lee 5 python string dataframe pandas

我有多列的熊猫数据框,其中混合了值和不需要的字符。

columnA        columnB    columnC        ColumnD
\x00A\X00B     NULL       \x00C\x00D        123
\x00E\X00F     NULL       NULL              456
Run Code Online (Sandbox Code Playgroud)

我想做的是使这个数据框如下。

columnA  columnB  columnC   ColumnD
AB        NULL       CD        123
EF        NULL       NULL      456
Run Code Online (Sandbox Code Playgroud)

使用下面的代码,我可以从 columnA 中删除 '\x00' 但 columnC 很棘手,因为它在某些行中与 NULL 混合。

col_names = cols_to_clean
fixer = dict.fromkeys([0x00], u'')
for i in col_names:
if df[i].isnull().any() == False:
    if df[i].dtype != np.int64:
            df[i] = df[i].map(lambda x: x.translate(fixer))
Run Code Online (Sandbox Code Playgroud)

有什么有效的方法可以从 columnC 中删除不需要的字符?

cs9*_*s95 7

通常,要删除非 ascii 字符,请str.encode与 errors='ignore' 一起使用:

df['col'] = df['col'].str.encode('ascii', 'ignore').str.decode('ascii')
Run Code Online (Sandbox Code Playgroud)

要在多个字符串列上执行此操作,请使用

u = df.select_dtypes(object)
df[u.columns] = u.apply(
    lambda x: x.str.encode('ascii', 'ignore').str.decode('ascii'))
Run Code Online (Sandbox Code Playgroud)

尽管这仍然无法处理列中的空字符。为此,您可以使用正则表达式替换它们:

df2 = df.replace(r'\W+', '', regex=True)
Run Code Online (Sandbox Code Playgroud)