![](/img/trans.png)
[英]How do I manipulate pandas DataFrame with a column that has rows with strings that needs spliting
[英]how to manipulate column header strings in a dataframe
如何刪除列標題中的部分字符串“test_”。 圖片 dataframe 有很多列,所以 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)
我希望所有列標題僅標記為“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
您可以在使用以下代碼將數據轉換為 dataframe 之前清理數據:
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]
output:
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 文檔)來替換或刪除前綴“test_”。 列標題可以被視為 python 列表或 pandas 系列。 在任何情況下,您都可以迭代地對列標題的每個元素應用替換。
選項A
Pandas有一個字符串處理方法集合,可以通過pandas系列的str
屬性訪問。 由於列標題是一個系列,您可以將所需的模式替換為,
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.