如何操作数据框中的列 header 字符串
how to manipulate column header strings in a dataframe
如何删除第 headers 列中的部分字符串“test_”。图片数据框有很多列,所以 df.rename(columns={"test_Stock B":"Stock B"}) 不是我正在寻找的解决方案!
import pandas as pd
data = {'Stock A':[1, 1, 1, 1],
'test_Stock B':[3, 3, 4, 4],
'Stock C':[4, 4, 3, 2],
'test_Stock D':[2, 2, 2, 3],
}
df = pd.DataFrame(data)
# expect
data = {'Stock A':[1, 1, 1, 1],
'Stock B':[3, 3, 4, 4],
'Stock C':[4, 4, 3, 2],
'Stock D':[2, 2, 2, 3],
}
df_expacte = pd.DataFrame(data)
我希望所有列 headers 仅标记为“Stock x”而不是“test_Stock x”。谢谢你的想法!
您可以通过列表理解重新定义列:
df.columns = [x.replace("test_","") for x in df]
这输出:
Stock A Stock B Stock C Stock D
0 1 3 4 2
1 1 3 4 2
2 1 4 3 2
3 1 4 2 3
您可以在使用以下代码将数据转换为数据框之前清理数据:
cleaned_data = {k.replace('test_', ''): v for k,v in data.items()}
如果需要提取值 Stock x
使用 Series.str.extract
:
#if need uppercase letter after Stock + space
df.columns = df.columns.str.extract('(Stock\s+[A-Z]{1})', expand=False)
#if need any value after Stock + space
#df.columns = df.columns.str.extract('(Stock\s+.*)', expand=False)
print (df)
Stock A Stock B Stock C Stock D
0 1 3 4 2
1 1 3 4 2
2 1 4 3 2
3 1 4 2 3
或者如果需要删除 test_
使用 Series.str.replace
:
df.columns = df.columns.str.replace('test_', '')
import pandas as pd
data = {'Stock A':[1, 1, 1, 1],
'test_Stock B':[3, 3, 4, 4],
'Stock C':[4, 4, 3, 2],
'test_Stock D':[2, 2, 2, 3],
}
df = pd.DataFrame(data)
df.columns = [x.replace('test_','') for x in df.columns]
输出:
print(df)
Out[9]:
Stock A Stock B Stock C Stock D
0 1 3 4 2
1 1 3 4 2
2 1 4 3 2
3 1 4 2 3
您可以使用正则表达式(参见python documentation)替换或删除前缀“test_”。 header 列可以被视为 python 列表或 pandas 系列。在任何情况下,您都可以迭代地对 headers.
列的每个元素应用替换
选项 A
Pandas 有一个 string processing methods 的 collection,您可以通过 pandas 系列的 str
属性访问它。由于 headers 列是一个系列,您可以将所需的模式替换为
df.columns = df.columns.str.replace(r'^test_', '')
选项 B
正则表达式模块可用于在每一列 header 上使用 re.sub
方法替换所需的模式,使用列表理解。
import re
df.columns = [re.sub(r'^test_', '', col) for col in df.columns]
如何删除第 headers 列中的部分字符串“test_”。图片数据框有很多列,所以 df.rename(columns={"test_Stock B":"Stock B"}) 不是我正在寻找的解决方案!
import pandas as pd
data = {'Stock A':[1, 1, 1, 1],
'test_Stock B':[3, 3, 4, 4],
'Stock C':[4, 4, 3, 2],
'test_Stock D':[2, 2, 2, 3],
}
df = pd.DataFrame(data)
# expect
data = {'Stock A':[1, 1, 1, 1],
'Stock B':[3, 3, 4, 4],
'Stock C':[4, 4, 3, 2],
'Stock D':[2, 2, 2, 3],
}
df_expacte = pd.DataFrame(data)
我希望所有列 headers 仅标记为“Stock x”而不是“test_Stock x”。谢谢你的想法!
您可以通过列表理解重新定义列:
df.columns = [x.replace("test_","") for x in df]
这输出:
Stock A Stock B Stock C Stock D
0 1 3 4 2
1 1 3 4 2
2 1 4 3 2
3 1 4 2 3
您可以在使用以下代码将数据转换为数据框之前清理数据:
cleaned_data = {k.replace('test_', ''): v for k,v in data.items()}
如果需要提取值 Stock x
使用 Series.str.extract
:
#if need uppercase letter after Stock + space
df.columns = df.columns.str.extract('(Stock\s+[A-Z]{1})', expand=False)
#if need any value after Stock + space
#df.columns = df.columns.str.extract('(Stock\s+.*)', expand=False)
print (df)
Stock A Stock B Stock C Stock D
0 1 3 4 2
1 1 3 4 2
2 1 4 3 2
3 1 4 2 3
或者如果需要删除 test_
使用 Series.str.replace
:
df.columns = df.columns.str.replace('test_', '')
import pandas as pd
data = {'Stock A':[1, 1, 1, 1],
'test_Stock B':[3, 3, 4, 4],
'Stock C':[4, 4, 3, 2],
'test_Stock D':[2, 2, 2, 3],
}
df = pd.DataFrame(data)
df.columns = [x.replace('test_','') for x in df.columns]
输出:
print(df)
Out[9]:
Stock A Stock B Stock C Stock D
0 1 3 4 2
1 1 3 4 2
2 1 4 3 2
3 1 4 2 3
您可以使用正则表达式(参见python documentation)替换或删除前缀“test_”。 header 列可以被视为 python 列表或 pandas 系列。在任何情况下,您都可以迭代地对 headers.
列的每个元素应用替换选项 A
Pandas 有一个 string processing methods 的 collection,您可以通过 pandas 系列的 str
属性访问它。由于 headers 列是一个系列,您可以将所需的模式替换为
df.columns = df.columns.str.replace(r'^test_', '')
选项 B
正则表达式模块可用于在每一列 header 上使用 re.sub
方法替换所需的模式,使用列表理解。
import re
df.columns = [re.sub(r'^test_', '', col) for col in df.columns]