我有一个带有colums标头的数据框,该标头由3个标记组成,这些标记由'__'分隔
例如
A__2__66 B__4__45
0
1
2
3
4
5
我知道我无法拆分标题,而仅将第一个标签与此代码一起使用; df.columns=df.columns.str.split('__').str[0]
给予:
A B
0
1
2
3
4
5
有没有一种方法可以组合使用标记,例如1和3。
给予
A__66 B__45
0
1
2
3
4
5
我尝试了以下内容,但不起作用
df.columns=df.columns.str.split('__').str[0]+'__'+df.columns.str.split('__').str[2]
[使用特定的正则表达式替换:
In [124]: df.columns.str.replace(r'__[^_]+__', '__')
Out[124]: Index(['A__66', 'B__45'], dtype='object')
使用Index.map
和Index.map
来选择列表的第一个和第三个值:
f-string
也可以尝试拆分并加入:
df.columns = df.columns.str.split('__').map(lambda x: f'{x[0]}__{x[2]}')
print (df)
A__66 B__45
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
我发现您自己的解决方案非常好,并且可能是最易读的。只需稍作调整
df.columns=['__'.join((i[0],i[-1])) for i in df.columns.str.split('__')]
#Columns: [A__66, B__45]
df.columns = df.columns.str.split('__').str[0] + '__' + df.columns.str.split('__').str[-1]
或者为了效率起见,我们不想两次调用Index(['A__66', 'B__45'], dtype='object')
:
str.split
lst_split = df.columns.str.split('__')
df.columns = lst_split.str[0] + '__' + lst_split.str[-1]