পান্ডাস রিড_সিএসভি ফাংশনে লোডে আমি কীভাবে লাইনগুলি ফিল্টার করতে পারি?


101

পান্ডাস ব্যবহার করে মেশিনে লোভিত হওয়া কোনও সিএসভির কোন লাইনের ফিল্টার করব? এটি এমন একটি বিকল্পের মতো বলে মনে হচ্ছে যাতে এটির সন্ধান করা উচিত read_csv। আমি কিছু অনুপস্থিত করছি?

উদাহরণ: আমাদের একটি টাইমস্ট্যাম্প কলাম সহ একটি সিএসভি রয়েছে এবং আমরা কেবল একটি ধ্রুবকের চেয়ে বেশি টাইমস্ট্যাম্পের সাথে লাইনগুলি লোড করতে চাই।

উত্তর:


174

সিএসভি ফাইলটি পান্ডাস বস্তুতে লোড হওয়ার আগে সারিগুলিকে ফিল্টার করার কোনও বিকল্প নেই।

আপনি হয় ফাইলটি লোড করতে পারেন এবং তারপরে ফিল্টার df[df['field'] > constant]করতে পারেন, বা যদি আপনার খুব বড় ফাইল থাকে এবং আপনি স্মৃতিশক্তি ফুরিয়ে যাওয়ার বিষয়ে উদ্বিগ্ন হন তবে একটি পুনরায় ব্যবহারকারীর ব্যবহার করুন এবং ফিল্টারটি প্রয়োগ করুন যেমন আপনি নিজের ফাইলের অংশগুলি একত্রিত করে যেমন:

import pandas as pd
iter_csv = pd.read_csv('file.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])

chunksizeআপনার উপলব্ধ মেমরি অনুসারে আপনি বিভিন্ন পরিবর্তন করতে পারেন। দেখুন এখানে আরো বিস্তারিত জানার জন্য।


কারণ chunk['filed']>constantআমি এটি 2 ধ্রুবক মানের মধ্যে স্যান্ডউইচ করতে পারি? যেমন: ধ্রুব 1> খণ্ড ['ক্ষেত্র']> ধ্রুব 2। বা আমি 'পরিসীমা' ব্যবহার করতে পারি?
weefwefwqg3

4
চেষ্টা করুন:chunk[(chunk['field'] > constant2)&(chunk['field']<constant1)]
জোহানেস ওয়াচস

এটি কি অনুপস্থিত .loc? chunk.loc[chunk['field'] > constant]
ভিনসেন্ট

4
আপনি বুলিয়ান মাস্কগুলি সাথে বা তার বাইরে ব্যবহার করতে পারেন .loc। আমি মনে করি .locনা 2012 সালে আবার বিদ্যমান ছিল, তবে আমার ধারণা এই দিনগুলি ব্যবহার .locকরা কিছুটা স্পষ্ট।
ম্যাটি জন

10

প্রসঙ্গের মধ্যে এটি করার জন্য আমি কোনও সরল-অগ্রণী উপায় পাইনি read_csv। তবে, read_csvএকটি ডেটা ফ্রেম প্রদান করে, যা বুলিয়ান ভেক্টর দ্বারা সারি নির্বাচন করে ফিল্টার করা যেতে পারে df[bool_vec]:

filtered = df[(df['timestamp'] > targettime)]

এটি ডিএফ-এ সমস্ত সারি নির্বাচন করছে (ধরে নিবেন যে ডিএফ কোনও ডাটাফ্রেম, যেমন একটি read_csvকলের ফলাফল হিসাবে অন্তত একটি ডেটটাইম কলাম থাকে timestamp) যার জন্য কলামের মানগুলি টার্গেটটাইমের মানের timestampচেয়ে বেশি। অনুরূপ প্রশ্ন


4
আমি এ সম্পর্কে নিশ্চিত নই, তবে আমার মনে হচ্ছে এটি মেমরির ব্যবহারের ক্ষেত্রে অত্যন্ত ভারী হবে have
নাথান

3

যদি ফিল্টারকৃত পরিসীমাটি যথাযথ হয় (কারণ এটি সাধারণত সময়ের (স্ট্যাম্প) ফিল্টারগুলির সাথে থাকে), তবে সর্বাধিক দ্রুত সমাধানটি সারিগুলির ব্যাপ্তিটিকে হার্ড-কোড করা hard পরামিতিগুলির skiprows=range(1, start_row)সাথে কেবল একত্রিত করুন nrows=end_row। তারপরে আমদানিতে সেকেন্ড সময় লাগে যেখানে গৃহীত সমাধানটি কয়েক মিনিট সময় নেয়। প্রাথমিকের সাথে কয়েকটি পরীক্ষা-নিরীক্ষার start_rowসময় আমদানির সময় সাশ্রয় করা কোনও বিশাল ব্যয় নয়। লক্ষ্য করুন আমরা ব্যবহার করে হেডার সারি রেখেছি range(1,..)


0

স্বীকৃত উত্তরের বিকল্প হ'ল ইনপুট ফাইলটি ফিল্টার করে প্রাপ্ত স্ট্রিংআইও-তে রিড_সিএসভি () প্রয়োগ করা।

with open(<file>) as f:
    text = "\n".join([line for line in f if <condition>])

df = pd.read_csv(StringIO(text))

এই সমাধানটি প্রায়শই গৃহীত উত্তরের চেয়ে দ্রুত হয় যখন ফিল্টারিং শর্তটি কেবল রেখার একটি ছোট অংশ ধরে রাখে


-3

আপনি যদি লিনাক্সে থাকেন তবে আপনি গ্রেপ ব্যবহার করতে পারেন।

# to import either on Python2 or Python3
import pandas as pd
from time import time # not needed just for timing
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


def zgrep_data(f, string):
    '''grep multiple items f is filepath, string is what you are filtering for'''

    grep = 'grep' # change to zgrep for gzipped files
    print('{} for {} from {}'.format(grep,string,f))
    start_time = time()
    if string == '':
        out = subprocess.check_output([grep, string, f])
        grep_data = StringIO(out)
        data = pd.read_csv(grep_data, sep=',', header=0)

    else:
        # read only the first row to get the columns. May need to change depending on 
        # how the data is stored
        columns = pd.read_csv(f, sep=',', nrows=1, header=None).values.tolist()[0]    

        out = subprocess.check_output([grep, string, f])
        grep_data = StringIO(out)

        data = pd.read_csv(grep_data, sep=',', names=columns, header=None)

    print('{} finished for {} - {} seconds'.format(grep,f,time()-start_time))
    return data

4
গ্রেপ ব্যবহার করা বেশ কয়েকটি কারণে গুরুতরভাবে খারাপ পছন্দ। 1) এটি ধীর 2) এটি পোর্টেবল নয় 3) এটি পান্ডাস বা অজগর নয় (আপনি ঠিক পাইথনের অভ্যন্তরে নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন) এ কারণেই আমি আপনার উত্তরকে অগ্রাহ্য করেছি
আহমেদ মাসুদ '

আপনার সমাধানটি সমস্ত প্ল্যাটফর্মে কাজ করে না এবং এর মধ্যে গ্রেপও রয়েছে। এটাই ডাউনটোটের কারণ।
রোমান ওরাক

-3

আপনি nrowsপ্যারামিটার নির্দিষ্ট করতে পারেন ।

import pandas as pd df = pd.read_csv('file.csv', nrows=100)

এই কোডটি 0.20.3 সংস্করণে ভাল কাজ করে।


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