pandas 基于特定模式重命名列

50pmv0ei  于 2023-03-11  发布在  其他
关注(0)|答案(2)|浏览(145)

我在 Dataframe 中有以下列:Id, category2, Brandyqdy1, Brandyqwdwdy2, Brandyqdw3
如果列名以Brand开头,以1结尾,则需要将其重命名为Vans。类似地,对于其他Brand列,请使用以下命令:rename_brands = {'1': 'Vans', '2': 'Nike', 3:'Adidas'}
此外,除了以Brand开头的列之外,我还将重命名其他列,总体而言:rename_columns = {'Id': 'record', 'Category2': 'Sku', '1': 'Vans', '2': 'Nike', 3:'Adidas'}

u5rb5r59

u5rb5r591#

可以链接两个rename方法。对于regex重命名,可以使用re.sub

import re

rename_brands = {'1': 'Vans', '2': 'Nike', 3:'Adidas'}
rename_columns = {'Id': 'record', 'Category2': 'Sku', '1': 'Vans', '2': 'Nike', '3':'Adidas'}

out = (df.rename(columns=rename_columns)
       .rename(columns=lambda col: re.sub('^Brand.*(\d)$',
                                          lambda m: rename_brands.get(m.group(1), m.group(0)),
                                          col)))
$ print(df)

   Id  Category2  Brandyqdy1  Brandyqwdwdy2  Brandyqdw3   1   2
0 NaN        NaN         NaN            NaN         NaN NaN NaN

$ print(out)

   record  Sku  Vans  Nike  Brandyqdw3  Vans  Nike
0     NaN  NaN   NaN   NaN         NaN   NaN   NaN
qkf9rpyu

qkf9rpyu2#

解决方案

1.从 Dataframe 中选择不包含“Brand”的列作为df1。相反,包括“Brand”作为df2
1.使用for循环替换df2中与brands字典对应的以数字结尾的列。

  1. Joindf1df2合并在一起。

示例代码

import pandas as pd

df = pd.DataFrame({
    'Id':['001', '002'], 
    'Category':['A', 'S'],
    'Brandtxsu1':[1, 1],
    'Brandxyw2':[2, 2]
})

print(df)

print('------------------------------------')

brands = {'1': 'Vans', '2': 'Nike'}

df1 = df[['Id', 'Category']].rename(columns={'Category': 'Record'})

df2 = df.loc[:, df.columns.str.startswith('Brand')]

for i in range(1,3):
    df2 = df2.rename(columns={df2.loc[:, df2.columns.str.endswith(str(i))].columns.values[0]: brands[str(i)]})

df_output = df1.join(df2)

print(df_output)

产出

Id Category  Brandtxsu1  Brandxyw2
0  001        A           1          2
1  002        S           1          2
------------------------------------
    Id Record  Vans  Nike
0  001      A     1     2
1  002      S     1     2

相关问题