在Pandas数据帧中一次替换所有字符

时间:2018-02-01 09:42:06

标签: python regex pandas replace

我有一个不同名称格式的多列。 例如:

df.columns = ['name_column 1 (type1), name-column_2-(type1),...]

我需要用下划线替换所有字符(下划线除外)。但如果有' - (',我只需要一个下划线' _',而不是每个特殊字符两个。

期望的输出:

df.columns = ['name_column_1_type1, name_column_2_type1,...]

我试过

for element in df.columns:
    re.sub('[^A-Za-z0-9]+', '_', element)
    print element

但没有任何事情发生,就像在其他一些尝试中一样。

提前致谢

3 个答案:

答案 0 :(得分:2)

使用replace + strip

df.columns = df.columns.str.replace('[^A-Za-z0-9]+', '_').str.strip('_')

样品:

df = pd.DataFrame(columns=["'name_column 1 (type1)", 'name-column_2-((type1)'])
print (df.columns.tolist())
["'name_column 1 (type1)", 'name-column_2-((type1)']

df.columns =  df.columns.str.replace('[^A-Za-z0-9]+', '_').str.strip('_')
print (df)
Empty DataFrame
Columns: [name_column_1_type1, name_column_2_type1]
Index: []

print (df.columns.tolist())
['name_column_1_type1', 'name_column_2_type1']

答案 1 :(得分:1)

尝试:

df.columns = [re.sub('[^A-z0-9]', '_', i).replace(" ", "_").replace("__", "_") for i in df.columns]

答案 2 :(得分:1)

没有任何事情发生,因为re.sub的结果没有分配给任何东西,因此丢失了。您可以使用列表推导并将结果分配回df.columns

df.columns = [re.sub('[^A-Za-z0-9]+', '_', element) for element in df.columns]
print df.columns

仍然是正则表达式模式错误,但这应该让你开始。