প্যানডাস রিড_সিএসভি এবং ইউজারকোলগুলি সহ ফিল্টার কলামগুলি


98

আমার কাছে একটি সিএসভি ফাইল রয়েছে যা 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 এছাড়াও তারিখটি তারিখ হিসাবে বিশ্লেষণ করা হচ্ছে।

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

নামের পরিবর্তে কলাম নম্বর ব্যবহার করা আমাকে একই সমস্যা দেয়। আমি রিড_সিএসভি পদক্ষেপের পরে ডামি কলামটি ফেলে সমস্যার সমাধান করতে পারি, তবে আমি কী ভুল হচ্ছে তা বোঝার চেষ্টা করছি। আমি পান্ডাস ব্যবহার করছি 0.10.1।

সম্পাদনা করুন: খারাপ হেডার ব্যবহার স্থির।


4
কিছু অন্য আপনার ব্যবহারের headerএবং namesকীওয়ার্ড সঠিক নয় (যে কেন প্রথম সারিতে আপনার উদাহরণে অনুপস্থিত। headerহেডার সঙ্গে সারি হিসাবে কোন int (ডিফল্ট 0) প্রত্যাশা করে। কারণ আপনি 'সত্য' দিতে যা 1 হিসেবে ব্যাখ্যা করা হয়, দ্বিতীয় সারি (প্রথম ডেটা সারি) শিরোনাম হিসাবে ব্যবহৃত হয় এবং অনুপস্থিত। তবে কলামের নামগুলি সঠিক কারণ আপনি এটি namesযুক্তির সাহায্যে ওভাররাইট করেন But তবে আপনি উভয়ই রাখতে পারেন এবং প্রথম সারিটি ডিফল্টরূপে কলামের নামের জন্য ব্যবহৃত হয়। তবে এটি আপনার প্রাথমিক প্রশ্নের সমাধান করে না
জরিস

4
এটি একটি usecolsবাগের মতো দেখাচ্ছে । সম্ভবত বাগ 2654 সম্পর্কিত ?
আবুদিস

নাম এবং শিরোনাম যুক্তি ছাড়াই বাগটি এখনও রয়েছে, ভাল সন্ধান।
অ্যান্ডি হেডেন

@ এবং আমি আরও কিছুক্ষন এটি দেখাব এবং এটি পান্ডাস বাগগুলিতে জমা দেব। আমি স্যানিটি চেক প্রশংসা করি।
চিপ

উত্তর:


115

@ চিপের উত্তরটি দুটি কীওয়ার্ড আর্গুমেন্টের পয়েন্টটি পুরোপুরি মিস করে।

  • শিরোনাম না থাকলে কেবলমাত্র নামগুলি প্রয়োজন হয় এবং আপনি পূর্ণসংখ্যার সূচকগুলির পরিবর্তে কলামের নাম ব্যবহার করে অন্যান্য যুক্তি নির্দিষ্ট করতে চান।
  • ইউজকোলগুলি পুরো ডেটা ফ্রেমটিকে মেমরিতে পড়ার আগে একটি ফিল্টার সরবরাহ করার কথা; যদি সঠিকভাবে ব্যবহৃত হয়, পড়ার পরে কলামগুলি মুছার দরকার নেই।

এই সমাধানটি সেই বৈচিত্রগুলি সংশোধন করে:

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

4
এটি সিএসভি ডেটা পার্স করার জন্য পাঠ্যপুস্তক সমাধান, তবে সেই সময় আমি নামগুলির যুক্তিটি ব্যবহার করতে চাইছিলাম কারণ আসল ডেটার কোনও শিরোনাম ছিল না।
চিপ

4
সেক্ষেত্রে আপনি নির্দিষ্ট করতে পারবেন না header=0। আপনি ব্যবহার করতে চান header=Noneএবং তারপরে namesঅতিরিক্তটি ব্যবহার করতে চান ।
ম্যাক করুন

তবে এখনও usecolsকলামগুলির জন্য পূর্ণসংখ্য সূচকগুলি ব্যবহার করুন যে কেউ @ ম্যাক রাখতে চান?
মিস্টার_আর_আমস_ডি

22

এই কোডটি আপনি যা চান তা অর্জন করে --- এটির অদ্ভুত এবং অবশ্যই বগী:

আমি লক্ষ্য করেছি যে এটি কার্যকর হয় যখন:

ক) আপনি index_colrel উল্লেখ । আপনি প্রকৃতপক্ষে কলামগুলির সংখ্যায় - সুতরাং এটির তিনটি কলাম এই উদাহরণে, চারটি নয় (আপনি পরে ড্রপ dummyএবং গণনা শুরু করেন)

খ) একই জন্য 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

4
ধন্যবাদ ডেটা সঠিকভাবে এসেছিল তার 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

কেন সূচক_কোল আমার ক্ষেত্রে সমস্যা তৈরি করছে, আমি আপনার প্রস্তাবিত কলামের নামটি ব্যবহার করার চেষ্টা করেছি, কিন্তু আমি কলাম নম্বরটি পাস করলে এটি কার্যকর হবে।
YouAreAwesome

4
এটি তবে সম্পদের অপচয়
Mr_and_Mrs_D

1

আপনাকে কেবল 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.DictReader ব্যবহার করুন এটি প্রক্রিয়া করা সহজ ...


4
এটি সহজ হতে পারে তবে এটি ব্যাপকভাবে ধীর। আপনি যখন বড় ডেটা-সেটে কাজ করছেন (আমি বর্তমানে নিজেই একক 13 জিবি সিএসভি ফাইলের সাথে কাজ করছি) তখন ফাইলটি লোড হওয়ার জন্য কয়েক ঘন্টা অপেক্ষা না করা আরও গুরুত্বপূর্ণ হয়ে ওঠে।
ভুয়া নাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.