我有一个不同名称格式的多列。 例如:
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
但没有任何事情发生,就像在其他一些尝试中一样。
提前致谢
答案 0 :(得分:2)
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
仍然是正则表达式模式错误,但这应该让你开始。