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