将列重命名为regex,如果不匹配则保留名称


data = {'First_Column': [1,2,3], 'Second_Column': [1,2,3], 
'FirstMidLAST.Ending': [1,2,3], 'First1Mid1LAST1.Ending': [1,2,3]}
df = pd.DataFrame(data)
First_Column   Second_Column   FirstMidLAST.Ending  First1Mid1LAST1.Ending
0    1              1               1                       1
1    2              2               2                       2
2    3              3               3                       3

我想重命名列如下:

First_Column   Second_Column   LAST    LAST1
0    1              1               1        1
1    2              2               2        2
2    3              3               3        3

所以我尝试了:

df.columns.str.extract(r'([^\]+).Ending')   
0
0   NaN
1   NaN
2   LAST
3   LAST1

col = df.columns.tolist()
for i in col[2:]:
print(re.search(r'([^\]+).Ending', i).group())
LAST.Ending
LAST1.Ending

首先,我注意到regex参数的不同输出。为什么?其次,我更喜欢有摘录的版本。但是,如果没有匹配项,如何保留原始名称?

THX

您可以使用np.where来填充不匹配的地方:

s = df.columns.str.extract(r'([^\]+).Ending')[0]
df.columns = np.where(s.isna(), df.columns, s)
# equivalently
# df.columns = s.mask(s.isna(), df.columns.values)

输出:

First_Column  Second_Column  LAST  LAST1
0             1              1     1      1
1             2              2     2      2
2             3              3     3      3

另一种方法是使用df.filter查找目标列,然后在使用regex后使用rename查找dict

s = df.filter(like='\',axis=1).columns
s1 = s.str.extract(r'([^\]+).Ending')[0].tolist()
df.rename(columns=dict(zip(s,s1)))
print(df)
First_Column  Second_Column  LAST  LAST1
0             1              1     1      1
1             2              2     2      2
2             3              3     3      3

最新更新