2016-07-28 12 views
9

मेरे पास एक बड़ी डेटा फ़ाइल है और मुझे कुछ अक्षरों में समाप्त होने वाली पंक्तियों को हटाने की आवश्यकता है।पायथन: कुछ वर्णों में समाप्त पंक्तियों को कैसे हटाएं?

User Name  DN 
MB212DA  CN=MB212DA,CN=Users,DC=prod,DC=trovp,DC=net 
MB423DA  CN=MB423DA,OU=Generic Mailbox,DC=prod,DC=trovp,DC=net 
MB424PL  CN=MB424PL,CN=Users,DC=prod,DC=trovp,DC=net 
MBDA423  CN=MBDA423,OU=DNA,DC=prod,DC=trovp,DC=net 
MB2ADA4  CN=MB2ADA4,OU=DNA,DC=prod,DC=trovp,DC=netenter code here 

कोड मैं उपयोग कर रहा हूँ:

from pandas import DataFrame, read_csv 
import pandas as pd 
f = pd.read_csv('test1.csv', sep=',',encoding='latin1') 
df = f.loc[~(~pd.isnull(f['User Name']) & f['UserName'].str.contains("DA|PL",))] 

मैं नियमित अभिव्यक्ति वाक्यविन्यास का उपयोग कैसे करूँ शब्द, जिसके अंत में हटाने के लिए "

यहाँ फ़ाइल मैं उपयोग कर रहा हूँ का एक उदाहरण है डीए "और" पीएल "लेकिन सुनिश्चित करें कि मैं अन्य पंक्तियों को हटा नहीं पाता क्योंकि उनमें उनमें" डीए "या" पीएल "शामिल है?

यह पंक्तियां हटाना चाहिए और मैं इस तरह एक फ़ाइल के साथ अंत: क्योंकि वे महंगाई भत्ते और पी एल में समाप्त हो गया

User Name  DN 
MBDA423  CN=MBDA423,OU=DNA,DC=prod,DC=trovp,DC=net 
MB2ADA4  CN=MB2ADA4,OU=DNA,DC=prod,DC=trovp,DC=net 

पहले 3 पंक्तियों नष्ट हो जाती हैं।

उत्तर

7

आप इस अभिव्यक्ति

df = df[~df['User Name'].str.contains('(?:DA|PL)$')] 
इस्तेमाल कर सकते हैं

यह उन सभी पंक्तियों को वापस कर देगा जो डीए या पीएल में खत्म नहीं होते हैं।

?: ऐसा है कि ब्रैकेट कुछ भी कैप्चर नहीं करेंगे। ,

UserWarning: This pattern has match groups. To actually get the groups, use str.extract. 

वैकल्पिक रूप से endswith() का उपयोग करने और नियमित अभिव्यक्ति के बिना, एक ही फ़िल्टर करना निम्नलिखित अभिव्यक्ति का उपयोग करके प्राप्त किया जा सकता है:

df = df[~df['User Name'].str.endswith(('DA', 'PL'))] 

अन्यथा, आप पांडा निम्नलिखित (हानिरहित) चेतावनी लौटने देखना चाहते हैं जैसा कि अपेक्षित है, नियमित अभिव्यक्ति के बिना संस्करण तेज होगा। एक साधारण परीक्षण, big_df से मिलकर, अपने मूल df की 10001 प्रतियों के होते हैं जो:

# Create a larger DF to get better timing results 
big_df = df.copy() 

for i in range(10000): 
    big_df = big_df.append(df) 

print(big_df.shape) 

>> (50005, 2) 

# Without regular expressions 
%%timeit 
big_df[~big_df['User Name'].str.endswith(('DA', 'PL'))] 

>> 10 loops, best of 3: 22.3 ms per loop 

# With regular expressions 
%%timeit 
big_df[~big_df['User Name'].str.contains('(?:DA|PL)$')] 

>> 10 loops, best of 3: 61.8 ms per loop 
+0

endswith एक regex को स्वीकार नहीं करता है? मुझे संदेह है कि यह हुड के नीचे एक का उपयोग करता है। –

+0

मैंने ऐसा भी सोचा, यहां तक ​​कि दस्तावेज़ भी बताते हैं कि पहला तर्क एक पैटर्न है, लेकिन मैं इसे रेगेक्स को पहचानने के लिए नहीं मिला। –

+1

@ एंडीहेडन स्पष्ट रूप से यह एक ट्यूपल लेता है। –

0

regular expressions के बजाय, आप endswith() विधि का उपयोग यह जांचने के लिए कर सकते हैं कि कोई स्ट्रिंग किसी विशिष्ट पैटर्न के साथ समाप्त हो जाती है या नहीं।

यानी .:

for row in rows: 
    if row.endswith('DA') or row.endswith('PL'): 
     #doSomething 

आप फ़िल्टर किए गए डेटा का उपयोग कर df एक और बनाने चाहिए, और फिर pd.to_csv() का उपयोग अपनी फ़ाइल की एक साफ संस्करण को बचाने के लिए।

2

आप जिससे आप दो चरित्र अंत का एक सेट में जाँच करता है, तो User_Name के अंतिम दो अक्षर नहीं (~) में हैं एक बूलियन मुखौटा का उपयोग कर सकते हैं:

>>> df[~df.User_Name.str[-2:].isin(['DA', 'PA'])] 
    User_Name             DN 
2 MB424PL CN=MB424PL, CN=Users, DC=prod, DC=trovp, DC=net 
3 MBDA423  CN=MBDA423, OU=DNA, DC=prod, DC=trovp, DC=net 
4 MB2ADA4 CN=MB2ADA4, OU=DNA, DC=prod, DC=trovp, DC=nete... 
संबंधित मुद्दे