2014-01-22 71 views
48

所以,我有一個列名稱的數據框,我想找到包含某個字符串但沒有完全匹配的列。我正在尋找名爲'spike'的列名,如'spike-2','hey spike','spiked-in''spike'部分始終是連續的)。熊貓:找到其名稱中包含特定字符串的列

我希望列名作爲字符串或變量返回,所以我以後正常訪問列df['name']df[name]。我試圖找到辦法做到這一點,無濟於事。有小費嗎?

回答

84

只是遍歷DataFrame.columns,現在這是你最終會與匹配列名的列表的示例:

import pandas as pd 

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]} 
df = pd.DataFrame(data) 

spike_cols = [col for col in df.columns if 'spike' in col] 
print(list(df.columns)) 
print(spike_cols) 

輸出:

['hey spke', 'no', 'spike-2', 'spiked-in'] 
['spike-2', 'spiked-in'] 

說明:

  1. df.columns返回列名稱列表
  2. [col for col in df.columns if 'spike' in col]在列表df.columns上重複變量col,並將其添加到結果列表中,如果col包含'spike'。這個語法是list comprehension

如果你只想要得到的數據相匹配,你可以做到這一點,該欄目設置:

df2 = df.filter(regex='spike') 
print(df2) 

輸出:

spike-2 spiked-in 
0  1   7 
1  2   8 
2  3   9 
+0

這是真棒!然而,我並不十分清楚它是如何工作的,對於Python和Pandas來說,它們都是新的。你能解釋一下嗎? – Sajber

+8

這就是''DataFrame.filter''確實是FYI(如果你願意,你可以提供一個正則表達式) – Jeff

+0

感謝您的解釋! – Sajber

15

This answer使用DataFrame.filter方法來做到這一點無列表理解:

import pandas as pd 

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]} 
df = pd.DataFrame(data) 

print(df.filter(like='spike').columns) 

會輸出'秒殺-2'。您還可以使用正則表達式,因爲有些人在上面留言建議:

print(df.filter(regex='spike|spke').columns) 

會輸出兩列:[「秒殺-2」,「嗨spke」]

4

您還可以使用df.columns [ df.columns.str.contains(PAT = '秒殺')]

data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]} 
df = pd.DataFrame(data) 

colNames = df.columns[df.columns.str.contains(pat = 'spike')] 

print(colNames) 

這將輸出的列名: '秒殺-2',u'spiked式

相關問題