পান্ডস পঠন_সিএসভি কম_মোহরি এবং টাইপ বিকল্পসমূহ


320

কল করার সময়

df = pd.read_csv('somefile.csv')

আমি পাই:

/ ব্যবহারকারীর / জোশ / অ্যানাকোন্ডা / এএনভিএস / অ্যাপি 27 / লিবি / স্পিথন 2.7/site-packages/pandas/io/parsers.py:1130: টাইপ ওয়ার্নিং: কলামগুলিতে (4,5,7,16) মিশ্র প্রকার রয়েছে। আমদানিতে dtype বিকল্প নির্দিষ্ট করুন বা কম_মেমরি = মিথ্যা সেট করুন।

dtypeবিকল্পটি কেন সম্পর্কিত low_memoryএবং কেন এটি Falseএ সমস্যার সাথে সহায়তা করবে ?


2
এই সতর্কতা সম্পর্কে আমার একটি প্রশ্ন আছে। কলামগুলির সূচকটি 0-ভিত্তিক উল্লেখ করা হয়েছে? উদাহরণস্বরূপ কলাম 4 যার একটি মিশ্র প্রকার রয়েছে, তা হল ডিএফ [:, 4] বা ডিএফ [:, 3]
মাজিয়ার

@ ম্যাসিয়ার যখন সিএসভি পড়েন তখন ডিফল্টরূপে একটি নতুন 0-ভিত্তিক সূচক তৈরি হয় এবং ব্যবহৃত হয়।
অগ্নিনির্বাপক

উত্তর:


431

অবচয় করা নিম্ন_মেমরি বিকল্প

low_memoryবিকল্প সঠিকভাবে অবচিত করা হয় না, কিন্তু এটি হওয়া উচিত যেহেতু এটা আসলে ভিন্নভাবে কিছু না [ উৎস ]

আপনি এই low_memoryসতর্কতাটি পাওয়ার কারণটি হ'ল কারণ প্রতিটি কলামের জন্য টাইপগুলি অনুমান করা খুব মেমরির দাবি। পান্ডস প্রতিটি কলামে ডেটা বিশ্লেষণ করে কী টাইপ করবেন তা নির্ধারণ করার চেষ্টা করে।

Dtype অনুমান (খুব খারাপ)

পান্ডারা কেবলমাত্র একবার নির্ধারণ করতে পারে পুরো কপিটি একবার পড়ার পরে কোনও কলামটি কী টাইপ করবে। এর অর্থ হ'ল পুরো ফাইলটি পড়ার আগে কিছুই সত্যই পার্স করা যায় না যদি আপনি শেষ মানটি পড়েন তবে সেই কলামটির dtype পরিবর্তন করার ঝুঁকি না থাকলে।

এমন একটি ফাইলের উদাহরণ বিবেচনা করুন যার কলামে ইউজার_আইডি রয়েছে। এটিতে 10 মিলিয়ন সারি রয়েছে যেখানে ব্যবহারকারী_আইডি সর্বদা সংখ্যা থাকে। যেহেতু পান্ডারা জানতে পারবেন না এটি কেবল সংখ্যা, তাই এটি সম্ভবত পুরো ফাইলটি না পড়া পর্যন্ত এটি মূল স্ট্রিং হিসাবে রাখবে।

টাইপগুলি নির্দিষ্ট করে (সর্বদা করা উচিত)

যোগ

dtype={'user_id': int}

থেকে pd.read_csv()কল পান্ডাস জানেন করতে হবে যখন এটি ফাইল পড়া শুরু হয়, যে এই শুধুমাত্র পূর্ণসংখ্যার হয়।

এছাড়াও লক্ষণীয় বিষয় হ'ল যদি ফাইলের শেষ লাইনটি কলামে "foobar"লেখা user_idথাকে তবে উপরের dtype নির্দিষ্ট করে থাকলে লোডিং ক্রাশ হবে।

ভাঙা ডেটার উদাহরণ যা ডাইপগুলি সংজ্ঞায়িত হয়ে গেলে ব্রেক হয়

import pandas as pd
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})

ValueError: invalid literal for long() with base 10: 'foobar'

টাইপগুলি সাধারণত একটি অদ্ভুত জিনিস, এগুলি সম্পর্কে এখানে আরও পড়ুন: http://docs.scipy.org/doc/numpy/references/generated/numpy.dtype.html

কি টাইপ বিদ্যমান?

আমাদের কাছে ন্যালি টাইপগুলি অ্যাক্সেস রয়েছে: ফ্লোট, ইনট, বুল, টাইমডেলটা [৪ [এনএস] এবং ডেটটাইম 64৪ [এনএস]। নোট করুন যে তারিখ / সময় টাইপগুলি টাইম জোন সচেতন নয় Note

পান্ডারা নিজস্ব ধরণের এই সেটটি প্রসারিত করে:

'ডেটটাইম 64 [এনএস,]' যা একটি সময় অঞ্চল সচেতন টাইমস্ট্যাম্প।

'বিভাগ' যা মূলত একটি এনাম (সংরক্ষণের জন্য পূর্ণসংখ্য কী দ্বারা প্রতিনিধিত্ব করা স্ট্রিং)

'পিরিয়ড []' টাইমডেল্টায় বিভ্রান্ত হওয়ার দরকার নেই, এই বিষয়গুলি আসলে নির্দিষ্ট সময়সীমে নোঙ্গর করা হয়

'স্পারস', 'স্পার্স [ইনট]', 'স্পার্স [ফ্লোট]' স্পার ডেটা বা 'এমন ডেটা যার মধ্যে অনেকগুলি গর্ত রয়েছে' এর জন্য হয় 'এনএএন বা ডেটাফ্রেমে কোনও সংরক্ষণ করার পরিবর্তে এটি স্থান সাশ্রয় করে বস্তু বাদ দেয় ।

'ইন্টারভাল' এটি নিজস্ব একটি বিষয় তবে এর মূল ব্যবহারটি সূচকের জন্য। আরও এখানে দেখুন

'ইন্ট 8', 'ইন্ট 16', 'ইন্ট 32', 'ইন্ট 64', 'ইউআইএনটি 8', 'ইউআইএনট 16', 'ইউআইএনটি 32', 'ইউআইএনটি 64' সমস্ত পান্ডার নির্দিষ্ট ইন্টিজার যা ন্যালি ভেরিয়েন্টের থেকে পৃথক নয় ble

'স্ট্রিং' স্ট্রিং ডেটার সাথে কাজ করার জন্য একটি নির্দিষ্ট ধরণের এবং .strএটি সিরিজের বৈশিষ্ট্যটিতে অ্যাক্সেস দেয় ।

'বুলিয়ান' নাম্বার 'বুল' এর মতো তবে এটি অনুপস্থিত ডেটা সমর্থন করে।

এখানে সম্পূর্ণ রেফারেন্স পড়ুন:

পান্ডস টাইপ রেফারেন্স

গটচস, ক্যাভেটস, নোটস

সেটিং dtype=objectউপরের সতর্কতাটি নিঃশব্দ করে দেবে, তবে এটিকে আরও মেমরি দক্ষ করে তুলবে না, কেবল কিছু হলে প্রক্রিয়া দক্ষ efficient

সেটিং dtype=unicodeকোনও কাজ করবে না, যেহেতু অকার্যকরভাবে, unicodeএটিকে প্রতিনিধিত্ব করা হয় object

রূপান্তরকারীদের ব্যবহার

@ স্প্যারো সঠিকভাবে 'foobar'উল্লিখিত কলামে মুখোমুখি হওয়ার সময় পান্ডা বয়ে যাওয়া এড়াতে রূপান্তরকারীদের ব্যবহারকে সঠিকভাবে নির্দেশ করে int। আমি যুক্ত করতে চাই যে রূপান্তরকারীরা পান্ডাসে ব্যবহার করার জন্য সত্যই ভারী এবং অদক্ষ এবং একটি সর্বশেষ উপায় হিসাবে ব্যবহার করা উচিত। এটি কারণ read_csv প্রক্রিয়া একটি একক প্রক্রিয়া।

সিএসভি ফাইলগুলি লাইন লাইন প্রক্রিয়াকরণ করা যায় এবং এভাবে সমান্তরালভাবে একাধিক রূপান্তরকারী দ্বারা আরও সহজেই ফাইলটিকে বিভাগগুলিতে কাটা এবং একাধিক প্রক্রিয়া চালিত করে প্রক্রিয়া করা যায়, যা পান্ডাস সমর্থন করে না। তবে এটি একটি ভিন্ন গল্প।


6
সুতরাং, একটি সেট করা dtype=objectআরও মেমরির দক্ষ না হওয়ার কারণে, ত্রুটি থেকে মুক্তি পাওয়ার পাশাপাশি এটির সাথে ঝামেলা করার কোনও কারণ আছে কি?
zthomas.nc

6
@ zthomas.nc হ্যাঁ, পান্ডাসকে কলামে যা আছে তা পরীক্ষা করার দরকার নেই। তাত্ত্বিকভাবে কিছু স্মৃতি সংরক্ষণ লোডিং (কিন্তু লোডিং পর কেউ সম্পূর্ণ হয়) যখন এবং কিছু cpu 'র চক্র (যা তুমি কি নোটিশ ডিস্ক আমি যেহেতু ইনপুট / আউটপুট বোতলের হতে হবে তাত্ত্বিক সংরক্ষণ।
firelynx

5
"আরও লক্ষণীয় বিষয় হ'ল যদি ফাইলের শেষ লাইনে ব্যবহারকারী_আইডি কলামে" ফুবার "লেখা থাকে, উপরোক্ত টাইপটি নির্দিষ্ট করা থাকলে লোডিং ক্র্যাশ হয়ে যায়" এমন কিছু "জবরদস্তি" বিকল্প রয়েছে যা ক্র্যাশ হওয়ার পরিবর্তে এই সারিটি ফেলে দিতে ব্যবহৃত হতে পারে?
চড়ুই

5
@ স্প্যারো থাকতে পারে তবে শেষবারের মতো এটিতে বাগগুলি ছিল। এটি প্যান্ডাসের সর্বশেষ সংস্করণে স্থির থাকতে পারে। error_bad_lines=False, warn_bad_lines=Trueকৌতুক করা উচিত। ডকুমেন্টেশন বলছে এটি কেবল সি পার্সারের সাথে বৈধ। এটি আরও বলে যে ডিফল্ট পার্সার কোনওটিই নয় যা কোনটি ডিফল্ট তা জানতে অসুবিধা হয়।
অগ্নিকাণ্ড

5
@nealmcb আপনি nrows=100একটি যুক্তি হিসাবে ডেটা ফ্রেমটি পড়তে পারেন এবং তারপরে df.dtypesযে ডাইটিপস পাবেন তা দেখতে পারেন। যাইহোক, এই টাইপগুলি সহ পুরো ডেটাফ্রেমটি পড়ার সময়, try/exceptআপনি ত্রুটিযুক্ত টাইপ অনুমানগুলি ধরতে ভুলবেন না তা নিশ্চিত করুন । আপনি জানেন ডেটা নোংরা।
অগ্নিনির্বাপক

50

চেষ্টা করুন:

dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

পান্ডাস ডকুমেন্টেশন অনুসারে:

dtype: কলামের নাম বা ডিক্ট টাইপ করুন -> টাইপ করুন

লো-মেমোরির ক্ষেত্রে এটি ডিফল্টরূপে সত্য এবং এখনও নথিভুক্ত হয়নি। আমি যদিও এটি প্রাসঙ্গিক মনে করি না। ত্রুটি বার্তাটি জেনেরিক, সুতরাং আপনার কোনওভাবেই কম_মেমোরির সাথে জগাখিচির দরকার নেই। আশা করি এটি আপনার সহায়তা করে এবং আপনার আরও সমস্যা আছে কিনা তা আমাকে জানান


1
যোগ করা হচ্ছে dtype=unicodeউত্পাদিত: NameError: name 'unicode' is not defined। তবে unicodeউদ্ধৃতি ('ইউনিকোড'-তে) রাখার ফলে দেখা যাচ্ছে!
sedh

5
@ সেদেহ আপনি অজগর প্রকার হিসাবে বা হিসাবে টাইপগুলি নির্দিষ্ট করতে পারেন numpy.dtype('unicode')। আপনি যখন dtype বিকল্পটি একটি স্ট্রিং দেন, এটি numpy.dtype()ডিফল্টরূপে এটি কারখানার মাধ্যমে কাস্ট করার চেষ্টা করবে । নির্দিষ্ট 'unicode'করা আসলে কিছুই করবে না, ইউনিকোডগুলি কেবলমাত্র আপকাস্ট করা হয়েছে objects। আপনি পাবেনdtype='object'
1515 7:34 এ অগ্নিনির্বাপক

43
df = pd.read_csv('somefile.csv', low_memory=False)

এটি সমস্যার সমাধান করা উচিত। CSV থেকে 1.8M সারি পড়ার সময় আমি ঠিক একই ত্রুটি পেয়েছি।


51
এটি ত্রুটিটি নিঃশব্দ করে দেয় তবে আসলে অন্য কিছু পরিবর্তন করে না।
অগ্নিনির্বাপু 13:38

2
1.5 জিবি ডেটা ফাইল চালানোর সময় আমার একই সমস্যা আছে
সিত্জ ব্লগজ

18

যেমন ফায়ারিনেক্সের দ্বারা পূর্বে উল্লিখিত হয়েছে যদি dtype স্পষ্টভাবে নির্দিষ্ট করা থাকে এবং এমন মিশ্র ডেটা থাকে যা সেই dtype সাথে সামঞ্জস্যপূর্ণ না হয় তবে লোডিং ক্র্যাশ হয়ে যাবে। অসামঞ্জস্যপূর্ণ ডেটা টাইপের সাথে মানগুলি পরিবর্তন করতে আমি এই জাতীয় রূপান্তরকারীটিকে একটি workaround হিসাবে ব্যবহার করেছি যাতে ডেটা এখনও লোড হতে পারে।

def conv(val):
    if not val:
        return 0    
    try:
        return np.float64(val)
    except:        
        return np.float64(0)

df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})

2

আমার ~ 400 এমবি ফাইলের সাথে একই রকম সমস্যা ছিল। সেটিংটি low_memory=Falseআমার জন্য কৌশলটি করেছে। প্রথমে সাধারণ জিনিসগুলি করুন, আমি পরীক্ষা করব যে আপনার ডেটাফ্রেমটি আপনার সিস্টেমের মেমরির চেয়ে বড় নয়, পুনরায় বুট করুন, এগিয়ে যাওয়ার আগে র‌্যাম সাফ করুন। আপনি যদি এখনও ত্রুটিগুলির মধ্যে পড়ে চলেছেন তবে আপনার .csvফাইলটি ঠিক আছে তা নিশ্চিত করে নেওয়া উপযুক্ত, এক্সেলে একবার তাকাবেন এবং নিশ্চিত করুন যে কোনও সুস্পষ্ট দুর্নীতি নেই। ভাঙা আসল তথ্যগুলি সর্বনাশ করতে পারে ...


1

বিশাল সিএসভি ফাইল (6 মিলিয়ন সারি) প্রক্রিয়াকরণ করার সময় আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমার তিনটি সমস্যা ছিল: ১. ফাইলটিতে অদ্ভুত অক্ষর রয়েছে (এনকোডিং ব্যবহার করে স্থির করা হয়েছে) ২. ডাটাটাইপ নির্দিষ্ট করা হয়নি (dtype প্রপার্টি ব্যবহার করে স্থির করা) ৩. উপরোক্ত ব্যবহার করে আমি এখনও এমন একটি সমস্যার মুখোমুখি হয়েছি যা ফাইল_ফর্ম্যাটের সাথে সম্পর্কিত ছিল যা না হতে পারে ফাইলের উপর ভিত্তি করে সংজ্ঞায়িত (চেষ্টা করে স্থির করে .. বাদে ..)

df = pd.read_csv(csv_file,sep=';', encoding = 'ISO-8859-1',
                 names=['permission','owner_name','group_name','size','ctime','mtime','atime','filename','full_filename'],
                 dtype={'permission':str,'owner_name':str,'group_name':str,'size':str,'ctime':object,'mtime':object,'atime':object,'filename':str,'full_filename':str,'first_date':object,'last_date':object})

try:
    df['file_format'] = [Path(f).suffix[1:] for f in df.filename.tolist()]
except:
    df['file_format'] = ''

-1

এটি low_memory = Falseএকটি ডেটা ফ্রেম আমদানির সময় আমার সাথে কাজ করেছিল। এটাই হ'ল আমার জন্য এই সমস্ত পরিবর্তন:

df = pd.read_csv('export4_16.csv',low_memory=False)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.