पांडे usecols के साथ read_csv और फ़िल्टर कॉलम


97

मेरे पास एक सीएसवी फाइल है जो pandas.read_csvकॉलम को फिल्टर करने usecolsऔर कई इंडेक्स का उपयोग करने के साथ सही ढंग से नहीं आ रही है ।

import pandas as pd
csv = r"""dummy,date,loc,x
   bar,20090101,a,1
   bar,20090102,a,3
   bar,20090103,a,5
   bar,20090101,b,1
   bar,20090102,b,3
   bar,20090103,b,5"""

f = open('foo.csv', 'w')
f.write(csv)
f.close()

df1 = pd.read_csv('foo.csv',
        header=0,
        names=["dummy", "date", "loc", "x"], 
        index_col=["date", "loc"], 
        usecols=["dummy", "date", "loc", "x"],
        parse_dates=["date"])
print df1

# Ignore the dummy columns
df2 = pd.read_csv('foo.csv', 
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"], # <----------- Changed
        parse_dates=["date"],
        header=0,
        names=["dummy", "date", "loc", "x"])
print df2

मुझे उम्मीद है कि लापता डमी कॉलम को छोड़कर df1 और df2 समान होना चाहिए, लेकिन कॉलम गलत तरीके से आते हैं। साथ ही तारीख को तारीख के रूप में पार्स किया जा रहा है।

In [118]: %run test.py
               dummy  x
date       loc
2009-01-01 a     bar  1
2009-01-02 a     bar  3
2009-01-03 a     bar  5
2009-01-01 b     bar  1
2009-01-02 b     bar  3
2009-01-03 b     bar  5
              date
date loc
a    1    20090101
     3    20090102
     5    20090103
b    1    20090101
     3    20090102
     5    20090103

नामों के बजाय कॉलम नंबरों का उपयोग करने से मुझे वही समस्या होती है। मैं read_csv चरण के बाद डमी कॉलम को हटाकर समस्या को हल कर सकता हूं, लेकिन मैं यह समझने की कोशिश कर रहा हूं कि क्या गलत हो रहा है। मैं 0.10.1 पांडा का उपयोग कर रहा हूं।

संपादित करें: फिक्स्ड खराब हेडर उपयोग।


1
कुछ और, आपके headerऔर namesकीवर्ड का उपयोग सही नहीं है (इसीलिए आपके उदाहरण में पहली पंक्ति गायब है। headerशीर्ष लेख के साथ पंक्ति के रूप में एक int (डिफ़ॉल्ट 0) की अपेक्षा करता है। क्योंकि आप 'True' देते हैं, जिसकी व्याख्या 1 के रूप में की गई है। दूसरी पंक्ति (पहली डेटा पंक्ति) का उपयोग हेडर के रूप में किया जाता है और गायब हो जाता है। हालांकि कॉलम के नाम सही हैं क्योंकि आप namesतर्क के साथ ओवरराइट करते हैं। लेकिन आप उन्हें छोड़ सकते हैं और पहली पंक्ति को डिफ़ॉल्ट रूप से कॉलम नामों के लिए उपयोग किया जाता है। हालाँकि, यह आपके प्रारंभिक प्रश्न को हल नहीं करता है।
जोरिस

1
यह usecolsबग जैसा दिखता है । संभवतः 2654 बग से संबंधित है ?
abudis

बग अभी भी नाम और हेडर तर्कों के बिना है, अच्छा लगता है।
एंडी हेडन

@ कैंडी मैं इसे थोड़ा और बढ़ा दूंगा और इसे पांडा के कीड़े को सौंप दूंगा। मैं स्वच्छता जांच की सराहना करता हूं।
चिप

जवाबों:


113

@चिप का उत्तर दो कीवर्ड तर्क के बिंदु को पूरी तरह से याद करता है।

  • नाम केवल तब आवश्यक होते हैं जब कोई हेडर नहीं होता है और आप पूर्णांक सूचकांकों के बजाय स्तंभ नामों का उपयोग करके अन्य तर्क निर्दिष्ट करना चाहते हैं।
  • usecols पूरे डेटाफ्रेम को मेमोरी में पढ़ने से पहले एक फिल्टर प्रदान करने वाला है; यदि ठीक से उपयोग किया जाता है, तो पढ़ने के बाद कॉलम को हटाने की आवश्यकता नहीं होनी चाहिए।

यह समाधान उन विषमताओं को ठीक करता है:

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        header=0,
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"],
        parse_dates=["date"])

जो हमें देता है:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

1
यह CSV डेटा पार्स करने के लिए पाठ्यपुस्तक समाधान है, लेकिन उस समय मैं नाम तर्क का उपयोग करने पर आमादा था क्योंकि वास्तविक डेटा में कोई हेडर नहीं था।
चिप

2
उस स्थिति में, आप निर्दिष्ट नहीं करेंगे header=0। आप उपयोग करना चाहते हैं header=Noneऔर फिर namesइसके अलावा उपयोग करना चाहते हैं ।
मैक

लेकिन फिर भी usecols@Mack वाले कॉलम के लिए पूर्णांक अनुक्रमणिकाओं के साथ उपयोग करें ?
Mr_and_Mrs_D

22

यह कोड आपको क्या चाहिए --- यह भी अजीब और निश्चित रूप से छोटी गाड़ी है:

मैंने देखा कि यह कब काम करता है:

a) आप index_colrel निर्दिष्ट करते हैं । आपके द्वारा उपयोग किए जाने वाले स्तंभों की संख्या - इसलिए इस उदाहरण में इसके तीन स्तंभ हैं, चार नहीं (आप ड्रॉप करेंdummy और उसके बाद से गिनना शुरू करें)

b) उसी के लिए parse_dates

ग) के लिए ऐसा नहीं है usecols स्पष्ट कारणों के लिए ;) के लिए

d) यहाँ मैंने namesइस व्यवहार को दर्पण करने के लिए अनुकूलित किया

import pandas as pd
from StringIO import StringIO

csv = """dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5
"""

df = pd.read_csv(StringIO(csv),
        index_col=[0,1],
        usecols=[1,2,3], 
        parse_dates=[0],
        header=0,
        names=["date", "loc", "", "x"])

print df

जो प्रिंट करता है

                x
date       loc   
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

1
धन्यवाद। मुझे कभी भी डेटा और सही के namesआधार पर संख्याओं को फिर से व्यवस्थित करने के सही संयोजन का पता नहीं चला usecols
चिप

8

यदि आपकी सीएसवी फ़ाइल में अतिरिक्त डेटा है, तो आयात के बाद कॉलम को डेटाफ़्रेम से हटाया जा सकता है

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        index_col=["date", "loc"], 
        usecols=["dummy", "date", "loc", "x"],
        parse_dates=["date"],
        header=0,
        names=["dummy", "date", "loc", "x"])
del df['dummy']

जो हमें देता है:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

क्यों index_col मेरे मामले में समस्या पैदा कर रहा है, मैंने आपके द्वारा सुझाए गए की तरह कॉलम नाम का उपयोग करने की कोशिश की, लेकिन अगर मैंने कॉलम नंबर पारित किया तो यह काम कर गया।
YouAreAwesome

4
हालांकि यह संसाधनों की बर्बादी है
Mr_and_Mrs_D

0

आपको बस index_col=Falseपैरामीटर जोड़ना होगा

df1 = pd.read_csv('foo.csv',
     header=0,
     index_col=False,
     names=["dummy", "date", "loc", "x"], 
     index_col=["date", "loc"], 
     usecols=["dummy", "date", "loc", "x"],
     parse_dates=["date"])
  print df1

-4

csv को पहले आयात करें और csv.DictReader को अपनी प्रक्रिया में आसान बनाएं ...


2
यह आसान हो सकता है, लेकिन यह बड़े पैमाने पर धीमा है। जब आप बड़े डेटा-सेट पर काम कर रहे होते हैं (मैं वर्तमान में एक एकल 13 जीबी सीएसवी फ़ाइल के साथ काम कर रहा हूं), तो फ़ाइल को लोड करने के लिए घंटों इंतजार करने की आवश्यकता नहीं है।
नकली नाम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.