वह कॉलम ढूंढें जिसके नाम में एक विशिष्ट स्ट्रिंग है


137

मेरे पास कॉलम नामों के साथ एक डेटाफ्रेम है, और मैं उस एक को ढूंढना चाहता हूं जिसमें एक निश्चित स्ट्रिंग शामिल है, लेकिन यह बिल्कुल मेल नहीं खाता है। मैं के लिए खोज कर रहा हूँ 'spike'स्तंभ नाम की तरह में 'spike-2', 'hey spike', 'spiked-in'( 'spike'हिस्सा हमेशा निरंतर है)।

मैं चाहता हूं कि स्तंभ नाम को एक स्ट्रिंग या चर के रूप में लौटाया जाए, इसलिए मैं स्तंभ को बाद में df['name']या df[name]सामान्य रूप से एक्सेस करता हूं । मैंने ऐसा करने के तरीके खोजने की कोशिश की है, कोई फायदा नहीं हुआ। कोई सुझाव?

जवाबों:


229

बस इसे पुनरावृत्त करें 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'। यह वाक्य रचना सूची बोध है

यदि आप केवल उस कॉलम के साथ परिणामी डेटा सेट चाहते हैं, जो आपके साथ मेल खाता है, तो आप ऐसा कर सकते हैं:

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

आउटपुट:

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

1
वह तो कमाल है! मैं वास्तव में ठीक से समझ नहीं पाया कि यह कैसे काम करता है, हालांकि, अभी भी पायथन और पंडों दोनों के लिए नया है। क्या आप शायद समझा सकते हैं?
इरिकफ़ास

16
यह वही है जो DataFrame.filterFYI करता है (और यदि आप चाहें तो रेगेक्स की आपूर्ति कर सकते हैं)
Jeff

2
@xndrme आप शामिल होने के बजाय एक regex से मेल खाने वाले एक निश्चित स्तंभ को बाहर करने के लिए एक regex कैसे करेंगे ?
ध्रुव गुलाटी

3
@ ध्रुवगुलती यह संभव है कि आपके अवांछित कॉलम को भी इसमें गिरा दिया जाए df[df.columns.drop(spike_cols)], वहां आपको DataFrameसूची में मौजूद कॉलम के बिना spike_colsप्राप्त होता है जिसे आप अपने अवांछित रीसेक्स का उपयोग करके प्राप्त कर सकते हैं।
अल्वारो फ्यूएंटेस

1
अधिक संक्षिप्त कोड:df[[col for col in df.columns if "spike" in col]]
विंडशीम्स

71

यह उत्तर सूची बोध के बिना ऐसा करने के लिए 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', 'हे स्पिक']


22

आप भी उपयोग कर सकते हैं df.columns[df.columns.str.contains(pat = 'spike')]

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)

यह कॉलम नामों को आउटपुट करेगा: 'spike-2', 'spiked-in'

Pandas.Series.str.contains के बारे में अधिक ।


18
# select columns containing 'spike'
df.filter(like='spike', axis=1)

आप नाम, नियमित अभिव्यक्ति से भी चयन कर सकते हैं। का संदर्भ लें: pandas.DataFrame.filter


1
अब तक का सबसे आसान समाधान। सरल अभी तक शक्तिशाली!
सेसार इयुर्रो



0

स्टार्ट, कॉन्टेंस और एंड्स के आधार पर नाम और सब्मिट करना:

# from: /programming/21285380/find-column-whose-name-contains-a-specific-string
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
# from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html




import pandas as pd



data = {'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)



print("\n")
print("----------------------------------------")
colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist() 
print("Contains")
print(colNames_contains)



print("\n")
print("----------------------------------------")
colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist() 
print("Starts")
print(colNames_starts)



print("\n")
print("----------------------------------------")
colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist() 
print("Ends")
print(colNames_ends)



print("\n")
print("----------------------------------------")
df_subset_start = df.filter(regex='^spike',axis=1)
print("Starts")
print(df_subset_start)



print("\n")
print("----------------------------------------")
df_subset_contains = df.filter(regex='spike',axis=1)
print("Contains")
print(df_subset_contains)



print("\n")
print("----------------------------------------")
df_subset_ends = df.filter(regex='spike$',axis=1)
print("Ends")
print(df_subset_ends)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.