使用正则表达式重命名多个熊猫列

时间:2019-04-28 21:24:33

标签: python regex pandas

我正在尝试整理一个csv,但现在栏目对开发人员并不友好。我想使用正则表达式在列名中查找多个模式以替换多个条件。例如,给定df1,标题中带有leading/trailed spaceswhite space,括号()<,那么我想删除leading/trailing spaces和{{1 }},将parenthesis替换为white space,并将_替换为<

例如,将df1转换为df2:

LESS_THAN

我当前的实现方式是仅链接一堆str.replaces。有一个更好的方法吗?我当时认为正则表达式可能特别有用,因为有数百个列,而且我敢肯定,还有更多麻烦要解决。

df1 = pd.DataFrame({' APPLES AND LEMONS': [1,2], ' ORANGES ([POUNDS]) ': [2,1], ' BANANAS < 5 ': [8,9]})

APPLES AND LEMONS   ORANGES (POUNDS)    BANANAS < 5

0                   1                     2              8
1                   2                     1              9

df2 = pd.DataFrame({'APPLES_AND_LEMONS': [1,2], 'ORANGES_POUNDS': [2,1], 'BANANAS_LESS_THAN_5 ': [8,9]})

   APPLES_AND_LEMONS  ORANGES_POUNDS  BANANAS_LESS_THAN_5
0                  1               2                     8
1                  2               1                     9

2 个答案:

答案 0 :(得分:0)

多亏了Alollz给我的链接,我得到了比连续链接str.replace

更容易维护的解决方案。
def clean_column_names(df):

    df.columns = df.columns.str.strip()
    replace_dict = {' ': '_', '<': 'LESS_THAN', '(': '', ')':''}
    for i, j in replace_dict.items():
        new_columns = [column.replace(i, j) for column in df.columns]
        df.columns = new_columns

    return df

clean_column_names(df1)

   APPLES_AND_LEMONS  ORANGES_POUNDS  BANANAS_LESS_THAN_5
0                  1                 2                    8
1                  2                 1                    9

答案 1 :(得分:0)

不确定这是否对您更好。

old_cols = list(df1.columns.values)

remove = re.compile(r'^\s+|\s+$|[\(\)\[\]]')
wspace = re.compile(r'\s+')
less = re.compile(r'<')
great = re.compile(r'>')

new_cols = []

for i in old_cols:
    i = re.sub(remove, "", i)
    i = re.sub(wspace, "_", i)
    i = re.sub(less, "LESS_THAN", i)
    i = re.sub(less, "GREATER_THAN", i)
    new_cols.append(i)

df1.columns = new_cols