2015-01-30 7 views
5

मेरे पास बड़ी सीएसवी है जहां मुझे केवल पंक्तियों के उप-समूह में रूचि है। विशेष रूप से, मैं उन सभी पंक्तियों में पढ़ना चाहता हूं जो किसी विशेष स्थिति से पहले होती हैं।पांडों में सीएसवी की सशर्त पंक्ति पढ़ने

उदाहरण के लिए, यदि read_csv dataframe प्राप्त होते हैं:

 A B  C 
1 34 3.20 'b' 
2 24 9.21 'b' 
3 34 3.32 'c' 
4 24 24.3 'c' 
5 35 1.12 'a' 
... 
1e9 42 2.15 'd' 

वहाँ किसी तरह जब तक col बी ऊपर के उदाहरण में से 10 से अधिक सीएसवी में सभी पंक्तियों को पढ़ने के लिए है, मैं पढ़ना चाहते हैं में:

 A B  C 
1 34 3.20 'b' 
2 24 9.21 'b' 
3 34 3.32 'c' 
4 24 24.3 'c' 

मैं कैसे बाहर एक बार मैं में dataframe पढ़ा है इन पंक्तियों फेंकने के लिए पता है, लेकिन इस बिंदु पर मैं पहले से ही उन में पढ़ने कि सभी गणना खर्च किया है मैं सूचकांक करने के लिए पहुँच नहीं है। सीएसवी पढ़ने से पहले अंतिम पंक्ति का (skipfooter कृपया)

+1

मुझे नहीं लगता कि पांडस एपीआई में ऐसा करने का एक सीधा तरीका है। आपको शायद 'सीएसवी' को तोड़ना होगा, पंक्तियों को एक समय में पकड़ना होगा, उन्हें सूचियों की सूची में रख दें, एक बार जब आप अपनी आखिरी पंक्ति प्राप्त कर लेंगे, तो रोकें और फिर 'डेटाफ्रेम' को बाहर निकालें सूचियों की परिणामी सूची। –

+1

आप सीएसवी को टुकड़ों में पढ़ सकते हैं और केवल तभी संलग्न कर सकते हैं जब सबसेट आपकी हालत – EdChum

उत्तर

12

आप भाग में सीएसवी पढ़ सकते हैं। चूंकि pd.read_csv एक पुनरावर्तक लौटाएगा जब chunksize पैरामीटर निर्दिष्ट किया गया है, तो आप पूरी फ़ाइल को पढ़ने के बिना, केवल उतने ही हिस्सों को पढ़ने के लिए itertools.takewhile का उपयोग कर सकते हैं।

import itertools as IT 
import pandas as pd 

chunksize = 10 ** 5 
chunks = pd.read_csv(filename, chunksize=chunksize, header=None) 
chunks = IT.takewhile(lambda chunk: chunk['B'].iloc[-1] < 10, chunks) 
df = pd.concat(chunks) 
mask = df['B'] < 10 
df = df.loc[mask] 

या, df.loc[mask] उपयोग करने के लिए पिछले टुकड़ा से अवांछित पंक्तियों को दूर करने से बचने के लिए, शायद एक क्लीनर समाधान एक कस्टम जनरेटर परिभाषित करने के लिए किया जाएगा:

import itertools as IT 
import pandas as pd 

def valid(chunks): 
    for chunk in chunks: 
     mask = chunk['B'] < 10 
     if mask.all(): 
      yield chunk 
     else: 
      yield chunk.loc[mask] 
      break 

chunksize = 10 ** 5 
chunks = pd.read_csv(filename, chunksize=chunksize, header=None) 
df = pd.concat(valid(chunks)) 
+0

@DSM से मिलता है: क्या आपका मतलब है 'chunk.ix [-1,' B '] '? – unutbu

+0

@DSM: धन्यवाद, आप सही हैं। यहां तक ​​कि 'chunk.ix [-1,' B ']' गलत मान वापस कर देगा यदि 'chunk' की अनुक्रमणिका 1 मान के रूप में शामिल है। – unutbu

संबंधित मुद्दे