列重命名:在数字和字母之间切换

时间:2019-10-15 20:20:05

标签: python pandas dataframe

我的数据框:

X   Y   123_Z   1234_Z  123_Z_R 1234_Z_R
.   .   .       .       .       .
.   .   .       .       .       .

我想通过切换数字和字母来重命名数据中的列。

预期结果:

X   Y   Z_123   Z_1234  Z_R_123 Z_R_1234
.   .   .       .       .       .
.   .   .       .       .       .

注意:我有很多没有数字和数字的列。因此,我试图避免手动进行操作。

2 个答案:

答案 0 :(得分:3)

也许可行

df.columns = map(lambda s: '_'.join(s[1:] + [s[0]]) if  s[0].isdigit() else '_'.join(s), df.columns.str.split('_'))

Columns: ['X', 'Y', 'X_Y', 'Z_123', 'Z_1234', 'Z_R_123', 'Z_R_1234']

答案 1 :(得分:3)

mapreversed

df.columns = ['_'.join(reversed(x.split('_', 1))) for x in df.columns]
df

   X  Y Z_123 Z_1234 Z_R_123 Z_R_1234
0  .  .     .      .       .        .
1  .  .     .      .       .        .

rename

df.rename(columns=lambda x: '_'.join(reversed(x.split('_', 1))))

   X  Y Z_123 Z_1234 Z_R_123 Z_R_1234
0  .  .     .      .       .        .
1  .  .     .      .       .        .

如果您需要密切注意数字

使用re进行正则表达式拆分

import re

#                                               regex lookbehind
#                                               to check if underscore
#                                               is preceded by a digit
#                                                        ?
df.rename(columns=lambda x: '_'.join(reversed(re.split('(?<=\d)_', x, 1))))

   X  Y Z_123 Z_1234 Z_R_123 Z_R_1234
0  .  .     .      .       .        .
1  .  .     .      .       .        .