regex

2013-03-10 14 views
72

द्वारा पांडा में पंक्तियों को फ़िल्टर करने के लिए कैसे करें मैं कॉलम में से किसी एक पर रेगेक्स का उपयोग करके डेटाफ्रेम को साफ़ रूप से फ़िल्टर करना चाहता हूं।regex

एक काल्पनिक उदाहरण के लिए:

In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']}) 
In [211]: foo 
Out[211]: 
    a b 
0 1 hi 
1 2 foo 
2 3 fat 
3 4 cat 

मैं उन है कि एक regex का उपयोग कर f साथ शुरू करने के लिए पंक्तियों को फ़िल्टर करना चाहते हैं। सबसे पहले जाएं:

In [213]: foo.b.str.match('f.*') 
Out[213]: 
0 [] 
1 () 
2 () 
3 [] 

यह बहुत उपयोगी नहीं है।

In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0] 
Out[229]: 
    a b 
1 2 foo 
2 3 fat 

मुझे कृत्रिम रूप से हालांकि regex में एक समूह डाल बनाता है, और की तरह हो सकता है नहीं लगता है कि:

In [226]: foo.b.str.match('(f.*)').str.len() > 0 
Out[226]: 
0 False 
1  True 
2  True 
3 False 
Name: b 

तो मैं तब तक मेरी प्रतिबंध कर सकता है: हालांकि इस मुझे मेरे बूलियन सूचकांक मिल जाएगा जाने के लिए साफ रास्ता। क्या ऐसा करने के लिए इससे अच्छा तरीका है? बजाय

+3

आप regexes के लिए विवाहित नहीं कर रहे हैं, 'foo [foo.b.str.startswith ("f")] 'काम करेगा। – DSM

+0

आईएमएचओ मुझे लगता है कि 'foo [foo.b.str.match (' (f। *) ') Str.len()> 0]' एक बहुत अच्छा पर्याप्त समाधान है! प्रारंभिक से अधिक अनुकूलन और उपयोगी क्योंकि यह इसमें regex की बहुमुखी प्रतिभा पैक करता है। –

उत्तर

91

उपयोग contains:

In [10]: df.b.str.contains('^f') 
Out[10]: 
0 False 
1  True 
2  True 
3 False 
Name: b, dtype: bool 
+5

बुलियन कैसे उलटा जा सकता है? इसे मिला: http://stackoverflow.com/questions/15998188/how-can-i-obtain-the-element-wise-logical-not-of-a-pandas-series – dmeu

13

dataframe के साथ एकाधिक स्तंभ खोज:

frame[frame.filename.str.match('*.'+MetaData+'.*') & frame.file_path.str.match('C:\test\test.txt')] 
+0

'फ्रेम'? और 'सी: \ test \ test.txt''? ऐसा लगता है कि आप एक अलग सवाल का जवाब दे रहे हैं। –

+0

फ्रेम डीएफ है। यह एक ही प्रश्न से संबंधित है, लेकिन यह एक पंक्ति कोड में एकाधिक कॉलम ('फ़ाइल नाम' और 'file_path') को फ़िल्टर करने का उत्तर देता है। –

6

यह थोड़ी देर हो चुकी हो सकता है, लेकिन यह अब पांडा में करने के लिए आसान है। बुलियन परिणाम प्राप्त करने के लिए आप as_indexer=True के साथ मिलान कर सकते हैं। यह दस्तावेज है (match और contains के बीच अंतर के साथ) here

5

पहले से ही एक स्ट्रिंग हैंडलिंग फ़ंक्शन Series.str.startwith() है।

आपको foo[foo.b.str.startswith('f')] आज़माएं।

परिणाम:

a b 
1 2 foo 
2 3 fat 

मुझे लगता है कि आप क्या उम्मीद करते हैं।

0

एक Boolian समारोह की जाँच करता है कि regex और उपयोग स्तंभ पर लागू

foo बारे में [foo [ 'बी']। लागू (regex_function)]