NumPy বা পান্ডাস: একটি এনএএন মান থাকার সময় অ্যারে টাইপ পূর্ণসংখ্যার হিসাবে রাখা


160

ভিতরে থাকা কোনও উপাদান থাকা সত্ত্বেও কোনও numpyঅ্যারের ডেটা ধরণের int( int64বা যা কিছু হোক) হিসাবে ঠিক করার কোনও পছন্দসই উপায় আছে numpy.NaN?

বিশেষত, আমি ইন-হাউস ডেটা স্ট্রাকচারকে একটি পান্ডাস ডেটা ফ্রেমে রূপান্তর করছি। আমাদের কাঠামোয়, আমাদের কাছে পূর্ণসংখ্যার-প্রকারের কলাম রয়েছে যা এখনও NaN এর রয়েছে (তবে কলামটির dtype অন্তর্নির্মিত)। এটি যদি আমরা একটি ডেটা ফ্রেম হিসাবে তৈরি করি তবে এটি সমস্ত কিছুকে ভাসা হিসাবে পুনরায় সাজানো মনে হয়, তবে আমরা সত্যই তা হতে চাই int

থটস?

চেষ্টা করা জিনিস:

আমি from_records()প্যানডাসের অধীনে ফাংশনটি ব্যবহার করার চেষ্টা করেছি ata ডেটা ফ্রেমের সাহায্যে coerce_float=Falseএবং এটি কোনও সাহায্য করেনি। আমি এনএমপি ফিল_ভ্যালু সহ NumPy মাস্কেড অ্যারেগুলিও ব্যবহার করার চেষ্টা করেছি, যা কাজ করে না। এই সমস্তগুলির কারণে কলামের ডেটা টাইপটি একটি ফ্লোটে পরিণত হয়েছিল।


আপনি কি একটি নকল মুখোশযুক্ত অ্যারে ব্যবহার করতে পারেন?
মিগিলসন

আমি এটা চেষ্টা করে দেখব. আমি from_recordsপ্যানডাসের অধীনেও ফাংশনটি চেষ্টা করেছি ata ডেটা ফ্রেমের সাথে coerce_float=False, তবে ভাগ্য নেই ... এটি এখনও নতুন ডেটা টাইপ করে float64
এলী

1
হ্যাঁ, ভাগ্য নেই। এমনকি মুখোশযুক্ত অ্যারে সহ, এটি এখনও ভাসাতে রূপান্তরিত হয়। দেখে মনে হচ্ছে পান্ডাস এরকম: "কোথাও কোন এনএএন আছে? ... তারপরে সবকিছুই ভাসা।" আশা করি এর আশেপাশে একটি উপায় আছে।
এলী

1
Ptionচ্ছিক নলযোগ্য পূর্ণসংখ্যার সমর্থনটি এখন আনুষ্ঠানিকভাবে পান্ডাস 0.24.0-এ যুক্ত হয়েছে - শেষ পর্যন্ত :) - দয়া করে একটি আপডেট উত্তর বেলো খুঁজে নিন। পান্ডাস 0.24.x রিলিজ নোটগুলি
মোরক

উত্তর:


70

এই ক্ষমতাটি পান্ডায় যুক্ত হয়েছে (সংস্করণ 0.24 দিয়ে শুরু): https://pandas.pydata.org/pandas-docs/version/0.24/whatnew/v0.24.0.html#optional-integer-na-support

এই মুহুর্তে, এটির জন্য ডিফল্ট dtype int64 (লোয়ারকেস) না হয়ে এক্সটেনশন dtype Int64 (মূলধন) ব্যবহার প্রয়োজন।


1
আপাতত আপনাকে 'Int64'এটির কাজ করতে একটি বিশেষ টাইপ নির্দিষ্ট করতে হবে। এটি আরও ভাল হবে যখন এটি ডিফল্টরূপে সক্ষম হবে।
জিন পল

এটা অসাধারণ! একটি ছোট সমস্যা আছে যদিও পাইকার্ম যদি এভাবে ব্যবহার করা হয় তবে ডিবাগ উইন্ডোতে ডেটাফ্রেমটি প্রদর্শন করতে ব্যর্থ। এটি প্রদর্শনের জন্য কীভাবে বাধ্য করতে হয় তার জন্য আপনি অন্য প্রশ্নের জন্য আমার উত্তর দেখতে পারেন: স্ট্যাকওভারফ্লো / প্রশ্ন / 38956660/… (সেখানে মূল সমস্যাটি ভিন্ন, তবে ডেটাফ্রেমের কাজটি সমাধান করার সমাধান)
আলা এম।

আমার কি ব্যবহার করতে হবে 'Int64'বা এর মতো কিছু আছে 'Int8'? এটি তুলনায় এটি একটি উন্মাদ পরিমাণ মেমরি ব্যবহার করে np.float
সুপারডুপারেরো

'Int8'কাজ করে মনে হচ্ছে, তবে np.floatএখনও দ্রুত পথ লোড হচ্ছে বলে মনে হচ্ছে। ইস্যুটি মনে হচ্ছে এটি অভ্যন্তরীণ মেমরি ছেড়ে দিচ্ছে না। ধরে নিন জঞ্জাল সংগ্রহকারী শেষ পর্যন্ত চলবে।
সুপারডুপারেরো

103

NaNএকটি পূর্ণসংখ্যার অ্যারেতে সংরক্ষণ করা যায় না। এই মুহুর্তে পান্ডার একটি পরিচিত সীমাবদ্ধতা; আমি নুমপি-তে (আর-এ এনএ-এর অনুরূপ) এনএ মানগুলি নিয়ে অগ্রগতি হওয়ার অপেক্ষায় ছিলাম, তবে নুমপি এই বৈশিষ্ট্যগুলি পাওয়ার আগে এটি কমপক্ষে 6 মাস থেকে এক বছর হবে, মনে হয়:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na

(এই বৈশিষ্ট্যটি প্যান্ডাসের 0.24 সংস্করণ দিয়ে শুরু করা হয়েছে, তবে নোট করুন যে এটির জন্য এক্সটেনশন dtype int64 (মূলধন)) ব্যবহার করা দরকার, ডিফল্ট dtype int64 (লোয়ার কেস) এর পরিবর্তে: https://pandas.pydata.org/pandas- ডক্স / সংস্করণ / 0.24 / কী নতুন / v0.24.0.html # alচ্ছিক-পূর্ণসংখ্যা-না-সমর্থন )


7
হাই ওয়েস, এ সম্পর্কে কোনও আপডেট আছে? মূল তালিকায় একটি এনএ মান উপস্থিতির উপর ভিত্তি করে আমরা কলামগুলিতে যোগদানকারী ইস্যুগুলিতে রূপান্তরিত হয় সেগুলি ইনট বা ফ্লোটে রূপান্তরিত হয়। (এই ডেটাফ্রেমগুলিকে একীভূত করার চেষ্টা করার পরে বিষয়গুলি তৈরি করা)
Ca

1
আপডেট হওয়া লিংক: পান্ডাস-
ডকস.

8

যদি পারফরম্যান্স মূল সমস্যা না হয় তবে আপনি তার পরিবর্তে স্ট্রিংগুলি সঞ্চয় করতে পারেন।

df.col = df.col.dropna().apply(lambda x: str(int(x)) )

তারপরে আপনি NaNযত খুশি মিশ্রণ করতে পারেন। আপনি যদি আপনার আবেদনের উপর নির্ভর করে সত্যই পূর্ণসংখ্যা রাখতে চান তবে আপনি প্রতিনিধিত্ব করতে -1, বা 0, বা 1234567890, বা অন্য কোনও উত্সর্গীকৃত মান ব্যবহার করতে পারেনNaN

আপনি অস্থায়ীভাবে কলামগুলিও নকল করতে পারেন: আপনার যেমন ভাসা রয়েছে; অন্যান্য একটি পরীক্ষামূলক, ints বা স্ট্রিং সহ। তারপরে assertsপ্রতিটি যুক্তিসঙ্গত স্থানে সন্নিবেশ করান যাচাই করে যে দুটি সিঙ্ক হয়েছে। পর্যাপ্ত পরীক্ষার পরে আপনি ভাসমানগুলি ছেড়ে দিতে পারেন।


5

এটি সব ক্ষেত্রেই সমাধান নয়, তবে আমার (জিনোমিক কোঅর্ডিনেট) আমি 0 কে এনএএন হিসাবে ব্যবহার করেছি

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)

এটি অন্ততপক্ষে যথাযথ 'দেশীয়' কলামের ধরণের ব্যবহারের জন্য, বিয়োগ যেমন তুলনা, তুলনা ইত্যাদির জন্য প্রত্যাশার মতো কাজ করার অনুমতি দেয়


5

পান্ডাস v0.24 +

NaNপূর্ণসংখ্যার সিরিজে সমর্থন করার জন্য কার্যকারিতা v0.24-র উপরে পাওয়া যাবে। আছে তথ্য এই v0.24 অধ্যায়, এবং অধীন আরো বিস্তারিত জানার "নতুন কি" এ Nullable পূর্ণসংখ্যা ডাটা টাইপ

পান্ডাস v0.23 এবং তার আগের

সাধারণভাবে, এটা দিয়ে কাজ করতে সেরা floatসিরিজ যেখানে সম্ভব, সিরিজ থেকে upCast এমনকি যখন intথেকে floatঅন্তর্ভুক্তি কারণে NaNমান। এটি ভেক্টরাইজড নম্পপি-ভিত্তিক গণনা সক্ষম করে যেখানে অন্যথায় পাইথন-স্তরের লুপগুলি প্রক্রিয়া করা হবে।

দস্তাবেজগুলি পরামর্শ দেয় : "এর dtype=objectপরিবর্তে অ্যারে ব্যবহার করা একটি সম্ভাবনা ।" উদাহরণ স্বরূপ:

s = pd.Series([1, 2, 3, np.nan])

print(s.astype(object))

0      1
1      2
2      3
3    NaN
dtype: object

প্রসাধনী কারণে, যেমন কোনও ফাইলের আউটপুট, এটি পছন্দনীয় হতে পারে।

পান্ডাস v0.23 এবং পূর্ববর্তী: পটভূমি

NaNবিবেচনা করা হয় afloatডক্স বর্তমানে (v0.23 হিসাবে) কেন পূর্ণসংখ্যা সিরিজ upcasted হয় কারণ উল্লেখ float:

গ্রাউন্ড আপ থেকে নুমপি-তে উচ্চতর পারফরম্যান্সের এনএ সমর্থন তৈরির অভাবে, প্রাথমিক প্রাণঘাতীটি হল পূর্ণসংখ্যার অ্যারেতে এনএকে প্রতিনিধিত্ব করার ক্ষমতা।

এই বাণিজ্য বন্ধ মূলত মেমরি এবং পারফরম্যান্স কারণে তৈরি করা হয় এবং ফলাফলের সিরিজটি "সংখ্যাসূচক" হিসাবে অব্যাহত থাকে।

ডক্স এছাড়াও নিয়ম প্রদান কারণে upcasting জন্য NaNঅন্তর্ভুক্তি:

Typeclass   Promotion dtype for storing NAs
floating    no change
object      no change
integer     cast to float64
boolean     cast to object

1

এটি এখন সম্ভব, যেহেতু পান্ডাস বনাম 0.24.0

পান্ডাস 0.24.x রিলিজ নোটের উদ্ধৃতি: " পান্ডস অনুপস্থিত মানগুলির সাথে পূর্ণসংখ্যার টাইপগুলি ধারণ করার ক্ষমতা অর্জন করেছে।


1

কেবলমাত্র এটি যুক্ত করতে চেয়েছিলেন আপনি যদি কোনও ফ্লোট (1.143) ভেক্টরকে পূর্ণসংখ্যার (1) তে রূপান্তর করতে চেষ্টা করছেন যা এনএ রূপান্তর করে নতুন 'ইন্ট 64' টাইপে আপনাকে একটি ত্রুটি দেয়। এটি সমাধান করার জন্য আপনাকে সংখ্যাগুলি গোল করতে হবে এবং তারপরে ".স্টাইপ ('Int64')" করতে হবে

s1 = pd.Series([1.434, 2.343, np.nan])
#without round() the next line returns an error 
s1.astype('Int64')
#cannot safely cast non-equivalent float64 to int64
##with round() it works
s1.round().astype('Int64')
0      1
1      2
2    NaN
dtype: Int64

আমার ব্যবহারের ক্ষেত্রে এটি হল যে আমার কাছে একটি ফ্লোট সিরিজ রয়েছে যা আমি বৃত্তাকারে যেতে চাই, তবে আপনি যখন .গ্রাড () একটি '* .0' সংখ্যার শেষে রয়ে যান, সুতরাং আপনি সেই 0টি প্রান্ত থেকে বাদ দিতে পারেন ইন্টে রূপান্তর করা


0

যদি পাঠ্য ডেটাতে ফাঁকা থাকে, কলামগুলি যেগুলি সাধারণত পূর্ণসংখ্যার হবে সেগুলি ফ্লোট d৪ টাইপ হিসাবে ভাসিয়ে দেওয়া হবে কারণ int64 dtype নাল পরিচালনা করতে পারে না। আপনি যদি একাধিক ফাইল ফাঁকা দিয়ে লোড করতে থাকেন তবে এটি অবিচ্ছিন্ন স্কিমার কারণ হতে পারে (যা ভাসমান as৪ হিসাবে শেষ হবে এবং অন্যগুলি যা অন্তত 64৪ হিসাবে শেষ হবে)

এই কোডটি যে কোনও সংখ্যক কলামগুলিকে ইন্ট 64 এ রূপান্তরিত করার চেষ্টা করবে (ইন্ট 64৪ এর বিপরীতে) যেহেতু ইন্টার 64৪ টি নাল পরিচালনা করতে পারে

import pandas as pd
import numpy as np

#show datatypes before transformation
mydf.dtypes

for c in mydf.select_dtypes(np.number).columns:
    try:
        mydf[c] = mydf[c].astype('Int64')
        print('casted {} as Int64'.format(c))
    except:
        print('could not cast {} to Int64'.format(c))

#show datatypes after transformation
mydf.dtypes
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.