CSV ফাইলে একটি পান্ডাস ডেটা ফ্রেম লেখা


713

পান্ডাসে আমার একটি ডেটাফ্রেম রয়েছে যা আমি একটি সিএসভি ফাইলে লিখতে চাই। আমি এটি ব্যবহার করে করছি:

df.to_csv('out.csv')

এবং ত্রুটি পেয়ে:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

সহজেই এটিকে ঘুরে দেখার কোনও উপায় আছে (যেমন আমার ডেটা ফ্রেমে আমার ইউনিকোড অক্ষর রয়েছে)? এবং সিএসভির পরিবর্তে কোনও ট্যাব বিস্মৃত ফাইলটিতে লেখার কোনও উপায় আছে যেমন একটি 'টু-ট্যাব' পদ্ধতি (যা আমি মনে করি না এটি বিদ্যমান)?

উত্তর:


1045

কোনও ট্যাব দিয়ে সীমানা নির্ধারণ করতে আপনি এই sepযুক্তিটি ব্যবহার করতে পারেন to_csv:

df.to_csv(file_name, sep='\t')

একটি নির্দিষ্ট এনকোডিং ব্যবহার করতে (যেমন 'utf-8') encodingযুক্তিটি ব্যবহার করুন :

df.to_csv(file_name, sep='\t', encoding='utf-8')

32
আমি index=Falseসূচক ড্রপ যোগ করতে হবে ।
মেধাত

10
আমি 7 বছর আগে ইতিমধ্যে লিখেছি যে প্রশ্নের উত্তর আমি পেয়েছিলাম তা সম্পর্কে প্রাথমিকভাবে আমি বিভ্রান্ত হয়েছিলাম।
হেডেন

250

আপনি যখন পদ্ধতিটি ব্যবহার করে DataFrameকোনও সিএসভি ফাইলে কোনও বিষয় সংরক্ষণ করছেন to_csv, তখন আপনাকে সম্ভবত অবজেক্টের প্রতিটি সারিটির পূর্ববর্তী সূচকগুলি সংরক্ষণ করতে হবে না ।DataFrame

প্যারামিটারে বুলিয়ান মান পাস করে আপনি এড়াতে পারেন ।Falseindex

কিছুটা এরকম:

df.to_csv(file_name, encoding='utf-8', index=False)

সুতরাং যদি আপনার ডেটাফ্রেম অবজেক্টটি এমন কিছু হয়:

  Color  Number
0   red     22
1  blue     10

সিএসভি ফাইল সংরক্ষণ করবে:

Color,Number
red,22
blue,10

পরিবর্তে (ক্ষেত্রে যখন ডিফল্ট মানটি True পাস হয়েছিল)

,Color,Number
0,red,22
1,blue,10

যদি সূচকটি পছন্দসই হয় তবে এর একটি শিরোনামও থাকা উচিত? আপনি কি শুধু ব্যবহার করেন df.rename_axis('index_name')? যা ফাইলটি নিজেই পরিবর্তিত হয় না
জ্যাপ

19

একটি CSV ফাইলে একটি পান্ডাস ডেটা ফ্রেম লিখতে আপনার প্রয়োজন হবে DataFrame.to_csv। এই ফাংশনটি যুক্তিসঙ্গত ডিফল্টগুলির সাথে অনেকগুলি আর্গুমেন্ট সরবরাহ করে যা আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ততার জন্য আপনাকে প্রায়শই ওভাররাইডের প্রয়োজন হয় না। উদাহরণস্বরূপ, আপনি কোনও আলাদা বিভাজক ব্যবহার করতে চান, ডেটটাইম ফর্ম্যাট পরিবর্তন করতে পারেন, বা লেখার সময় সূচকটি ফেলে দিতে পারেন। to_csvএই প্রয়োজনীয়তাগুলি সমাধান করার জন্য আপনি তর্ক করতে পারেন।

এখানে একটি টেবিল সিএসভি ফাইলগুলিতে লেখার কিছু সাধারণ পরিস্থিতি এবং আপনি তাদের জন্য ব্যবহার করতে পারেন এমন যুক্তিগুলি তালিকাভুক্ত করে।

সিএসভি মা দোস্তকে লিখুন

পাদটিকা

  1. ডিফল্ট বিভাজককে কমা ( ',') বলে ধরে নেওয়া হয় । আপনার যদি না জানা থাকে তবে এটি পরিবর্তন করবেন না।
  2. ডিফল্ট হিসাবে, সূচকটি dfপ্রথম কলাম হিসাবে লেখা হয়। যদি আপনার ডেটাফ্রেমের কোনও সূচক না থাকে (আইওডাব্লু, df.indexএটি ডিফল্ট RangeIndex) তবে index=Falseলেখার সময় আপনি সেট করতে চাইবেন । এটি অন্যভাবে ব্যাখ্যা করতে, যদি আপনার ডেটাতে সূচি থাকে তবে আপনি index=Trueএটি ব্যবহার করতে (এবং হওয়া উচিত) এটি সম্পূর্ণরূপে ছাড়তে পারেন (যেমন ডিফল্ট হিসাবে থাকে True)।
  3. আপনি স্ট্রিং ডেটা লিখতে থাকলে এই পরামিতিটি সেট করা বুদ্ধিমানের কাজ হবে যাতে অন্যান্য অ্যাপ্লিকেশনগুলি কীভাবে আপনার ডেটা পড়তে পারে তা জানতে পারে। এটি UnicodeEncodeErrorসংরক্ষণের সময় আপনার মুখোমুখি হওয়া কোনও সম্ভাব্যতা এড়িয়ে যাবে ।
  4. আপনি যদি ডিস্কে বড় বড় ডেটা ফ্রেম (> 100 কে সারি) লিখছেন তবে সংক্ষেপণের পরামর্শ দেওয়া হচ্ছে কারণ এর ফলে অনেক ছোট আউটপুট ফাইল হবে। OTOH, এর অর্থ লেখার সময় বৃদ্ধি পাবে (এবং ফলস্বরূপ, ফাইলটি পড়ার সময়টি সঙ্কুচিত করা দরকার)।

18

'Utf-8' এ এনকোডিংয়ের সমস্যা থাকলে এবং সেল দিয়ে সেল যেতে চাইলে আপনি নিম্নলিখিত কিছু চেষ্টা করতে পারেন।

পাইথন 2

(যেখানে "df" আপনার ডেটাফ্রেম অবজেক্ট object

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
            df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            df.set_value(idx,column,'')
            continue

তারপরে চেষ্টা করুন:

df.to_csv(file_name)

আপনি কলামগুলির এনকোডিং এটি দ্বারা পরীক্ষা করতে পারেন:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

সতর্কতা: ত্রুটিগুলি = 'উপেক্ষা' কেবল অক্ষরটিকে বাদ দেবে যেমন

IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'

পাইথন ঘ

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
            df.set_value(idx,column,x)
        except Exception:
            print('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue

11

আপনি যদি ইউটিএফ -8 এনকোডিংও নির্দিষ্ট করে থাকেন তবে কখনও কখনও আপনি এই সমস্যার মুখোমুখি হন। আমি আপনাকে ফাইল পড়ার সময় এনকোডিং এবং ফাইলটিতে লেখার সময় একই এনকোডিং নির্দিষ্ট করার পরামর্শ দিচ্ছি। এটি আপনার সমস্যার সমাধান করতে পারে।


7

উইন্ডোজে পূর্ণ পথ সহ ফাইলের রফতানির উদাহরণ এবং যদি আপনার ফাইলে শিরোনাম থাকে :

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

উদাহরণস্বরূপ, যদি আপনি যেখানে আপনার স্ক্রিপ্টটি একই ডিরেক্টরিতে ফোল্ডারে সঞ্চয় করতে চান তবে utf-8 এনকোডিং এবং পৃথক হিসাবে ট্যাব সহ :

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')

7

এটি এই মামলার উত্তর হতে পারে না, তবে .to_csvআমার চেষ্টা করার সাথে আমারও একই ত্রুটি-বার্তা ছিল .toCSV('name.csv')এবং ত্রুটি-বার্তাটি অন্যরকম ছিল (" SparseDataFrame' object has no attribute 'toCSV') So

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')

আপনি দ্বিতীয়টিতে ত্রুটি পেয়েছেন বলে মনে হচ্ছে আপনি ব্যবহার করেছেন .toCSVএবং না .to_csv। আপনি আন্ডারস্কোরটি ভুলে গেছেন
কাইল সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.