我有一个数据帧,其列名类似于"AH_AP"one_answers"AH_AS"。
本质上,我只想交换下划线之前的部分和下划线之后的部分,这样列标题就是"AP_AH"one_answers"AS_AH"。
如果元素在列表中,我可以这样做,但我不知道如何将其应用于列名。
如果它是一个列表,我的解决方案如下:
columns = ['AH_AP','AS_AS']
def rejig_col_names():
elements_of_header = columns.split('_')
new_title = elements_of_header[-1] + "_" + elements_of_header[0]
return new_title
我想我需要将其应用于以下内容,但我不知道如何或如何引用df.columns:中的单个列
df.columns = df.columns.map()
感谢您的帮助。谢谢:(
您可以这样做:
输入:
df = pd.DataFrame(data=[['1','2'], ['3','4']], columns=['AH_PH', 'AH_AS'])
print(df)
AH_PH AH_AS
0 1 2
1 3 4
输出:
df.columns = df.columns.str.split('_').str[::-1].str.join('_')
print(df)
PH_AH AS_AH
0 1 2
1 3 4
解释:
在'_'上使用字符串访问器和拆分方法
然后使用带有索引切片反转的str访问器[::-1]可以颠倒列表的顺序
最后,使用字符串访问器和join,我们可以连接再次列出。
你几乎做到了:你可以进行
df.columns = df.columns.map(rejig_col_names)
除了用列名作为参数来调用函数之外,请这样更改它:
def rejig_col_names(col_name):
elements_of_header = col_name.split('_')
new_title = elements_of_header[-1] + "_" + elements_of_header[0]
return new_title
另一个答案的替代方案。使用您的功能和DataFrame.rename
import pandas as pd
def rejig_col_names(columns):
elements_of_header = columns.split('_')
new_title = elements_of_header[-1] + "_" + elements_of_header[0]
return new_title
data = {
'A_B': [1, 2, 3],
'C_D': [4, 5, 6],
}
df = pd.DataFrame(data)
df.rename(rejig_col_names, axis='columns', inplace=True)
print(df)
str.replace
也是通过交换捕获组的一个选项:
从ScottBoston 借来的样本输入
df = pd.DataFrame(data=[['1', '2'], ['3', '4']], columns=['AH_PH', 'AH_AS'])
然后捕获"_"之前和之后的所有内容,并交换捕获组1和2。
df.columns = df.columns.str.replace(r'^(.*)_(.*)$', r'2_1', regex=True)
PH_AH AS_AH
0 1 2
1 3 4