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



我正在尝试整理我得到的 csv,那里的列现在对开发人员不是很友好。我想使用正则表达式在列名中查找多个模式以替换多个条件。例如,给定带有 leading/trailed spaces 的 df1 、white space整个标题、括号()< ,那么我想删除leading/trailing spacesparenthesis,将white space替换为 _,并将<替换为LESS_THAN

例如,将 df1 转换为 df2:

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

我目前的实现是通过链接一堆str.replaces。有没有更好的方法可以做到这一点?我在想正则表达式可能特别有用,因为有数百列,我相信会有更多的头痛我还没有找到。

df1.columns = df1.columns.str.strip()
df1.columns = concatenated_df.columns.str.replace(' ','_').str.replace('<','LESS_THAN').str.replace('(', '').str.replace(')','')

多亏了 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

不确定这是否更适合您。

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

相关内容

  • 没有找到相关文章

最新更新