NaNs যুক্ত পান্ডাস কলামটি dtype `int` এ রূপান্তর করুন`


175

আমি নীচে হিসাবে একটি পান্ডাস ডেটা ফ্রেমে একটি .csv ফাইল থেকে ডেটা পড়ি। কলামগুলির মধ্যে একটির জন্য id, আমি কলামের প্রকারটি নির্দিষ্ট করতে চাই int। সমস্যাটি হচ্ছে idসিরিজের অনুপস্থিত / খালি মান রয়েছে।

আমি যখন id.csv পড়ার সময় কলামটি পূর্ণসংখ্যায় কাস্ট করার চেষ্টা করি তখন আমি পাই:

df= pd.read_csv("data.csv", dtype={'id': int}) 
error: Integer column has NA values

বিকল্পভাবে, আমি নীচের মতো পড়ার পরে কলামের ধরণটি রূপান্তরিত করার চেষ্টা করেছি, তবে এবার পেয়েছি:

df= pd.read_csv("data.csv") 
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer

আমি কীভাবে এটি সামাল দিতে পারি?


3
আমি মনে করি যে যদি অনুপস্থিত / এনএএন মান থাকে তবে পূর্ণসংখ্যা মানগুলি কোনও সিরিজ / ডেটাফ্রেমে রূপান্তর বা সংরক্ষণ করা যায় না। আমার মনে হয় এটি নম্পুটি সামঞ্জস্যতার সাথে করণীয় (আমি এখানে অনুমান করছি), আপনি যদি মানটির সামঞ্জস্যতা অনুপস্থিত চান তবে আমি মানগুলি ভাসমান হিসাবে সংরক্ষণ করতে পারি
এডচুম

1
এখানে দেখুন: pandas.pydata.org/pandas-docs/dev/… ; আপনার অবশ্যই ভাসা টাইপ থাকতে হবে যখন আপনার কাছে মূল্যবোধগুলি না পাওয়া যায় (বা প্রযুক্তিগতভাবে dtype অবজেক্ট করুন তবে এটি অক্ষম); আপনার টাইপ ব্যবহারের লক্ষ্য কী?
জেফ

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

1
আমারও এ নিয়ে সমস্যা আছে। আমার একাধিক ডেটাফ্রেম রয়েছে যা আমি বেশ কয়েকটি "পূর্ণসংখ্যা" কলামগুলির স্ট্রিং উপস্থাপনার ভিত্তিতে মার্জ করতে চাই। যাইহোক, যখন এই পূর্ণসংখ্যা কলামগুলির মধ্যে একটিতে এনপি.নান থাকে, তখন স্ট্রিং ingালাই "" .0 "উত্পন্ন করে, যা মার্জটি বন্ধ করে দেয়। জিনিসগুলিকে কেবল কিছুটা জটিল করে তোলে, সাধারণ কাজের আশেপাশে থাকলে চমৎকার হবে।
dermen

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

উত্তর:


169

পূর্ণসংখ্যা কলামগুলিতে NaN প্রতিনিধিত্বের অভাব একটি পান্ডাস "গেটচা"

স্বাভাবিক কাজটি হ'ল সহজভাবে ফ্লোট ব্যবহার করা।


13
ফ্লোটের মতো চিকিত্সা করা ছাড়াও কি অন্য কোনও কর্মসীমা আছে?
নিউম্যানরফরাইফ

3
@ jsc123 আপনি অবজেক্টটি dtype ব্যবহার করতে পারেন। এটি একটি সামান্য স্বাস্থ্যের সতর্কতা সহ আসে তবে বেশিরভাগ অংশই ভাল কাজ করে।
অ্যান্ডি হেডেন

1
আপনি কীভাবে অবজেক্ট dtype ব্যবহার করবেন তার একটি উদাহরণ সরবরাহ করতে পারেন? আমি পান্ডাস ডক্স এবং গুগলিং সন্ধান করছি এবং আমি এটি প্রস্তাবিত পদ্ধতিটি পড়েছি। তবে, কীভাবে অবজেক্টটি dtype ব্যবহার করতে হবে তার কোনও উদাহরণ আমি পাইনি।
মাইকেই

29
V0.24 এ, আপনি এখন করতে পারেন df = df.astype(pd.Int32Dtype())(সম্পূর্ণ ডেটা ফ্রেমে রূপান্তর করতে, বা) df['col'] = df['col'].astype(pd.Int32Dtype())। অন্যান্য গৃহীত nullable পূর্ণসংখ্যা ধরনের হয় pd.Int16Dtypeএবং pd.Int64Dtype। আপনার বিষ বাছুন।
CS95

1
এটি NAN মান তবে ইসনান চেকিং মোটেই কাজ করে না :(
উইনস্টন

117

সংস্করণে 0.24 + প্যান্ডাস অনুপস্থিত মানগুলির সাথে পূর্ণসংখ্যার টাইপগুলি ধারণ করার ক্ষমতা অর্জন করেছে।

নুলযোগ্য পূর্ণসংখ্যা ডেটা প্রকার

পান্ডারা ব্যবহার করে সম্ভবত অনুপস্থিত মানগুলির সাথে পূর্ণসংখ্যার ডেটা উপস্থাপন করতে পারে arrays.IntegerArray। এটি পান্ডাসের মধ্যে প্রয়োগ করা একটি এক্সটেনশন প্রকার। এটি পূর্ণসংখ্যার জন্য ডিফল্ট টাইপ নয় এবং অনুমান করা হবে না; আপনার অবশ্যই স্পষ্টভাবে dtype এর মধ্যে array()বা Series:

arr = pd.array([1, 2, np.nan], dtype=pd.Int64Dtype())
pd.Series(arr)

0      1
1      2
2    NaN
dtype: Int64

কলাম রূপান্তরযোগ্য পূর্ণসংখ্যায় রূপান্তর করার জন্য ব্যবহার করুন:

df['myCol'] = df['myCol'].astype('Int64')

4
আমি এই উত্তর পছন্দ।
সিএস 95

8
নোট করুন যে টাইপটি অবশ্যই হবে "Int64"এবং তা নয় "int64"(প্রথম 'আমি' অবশ্যই মূলধন হতে হবে)
ভাইচাসলভ জেড

2
df.myCol = df.myCol.astype('Int64')বাdf['myCol'] = df['myCol'].astype('Int64')
লোমাপ্প

43

আমার ব্যবহারের ক্ষেত্রে ডিবি টেবিলে লোড হওয়ার আগে ডেটা মংগ করা হচ্ছে:

df[col] = df[col].fillna(-1)
df[col] = df[col].astype(int)
df[col] = df[col].astype(str)
df[col] = df[col].replace('-1', np.nan)

NaNs সরান, int তে রূপান্তর করুন, str এ রূপান্তর করুন এবং তারপরে NAN পুনরায় প্রবেশ করুন।

এটি সুন্দর নয় তবে এটি কাজটি সম্পন্ন করে!


1
সিরিয়াল নম্বরগুলি লোড করার চেষ্টা করে আমি আমার চুলগুলি টানতে চলেছি যেখানে কিছু নাল এবং বাকীগুলি ভাসমান রয়েছে, এটি আমাকে বাঁচিয়েছে।
ক্রিস ডেকার

1
ওপি পূর্ণসংখ্যাগুলির একটি কলাম চায়। এটিকে স্ট্রিংয়ে রূপান্তর করা শর্তটি পূরণ করে না।
isষব গুপ্ত

1
কল যদি ইতিমধ্যে -1 না থাকে তবেই কাজ করে। অন্যথায়, এটি ডেটা নিয়ে
গণ্ডগোল

তাহলে কীভাবে ফিরে যাব .. ??
আবদুলসন

5

ড্যান্টিপ হিসাবে NaNs সমেত একটি পান্ডাস কলাম তৈরি করা এখন সম্ভব হয়েছে int, যেহেতু এটি এখন সরকারীভাবে পান্ডাসে 0.24.0 এ যুক্ত হয়েছে

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


4

আপনি যদি কোনও কলামে পুরোপুরি পূর্ণসংখ্যার এবং NaN একত্রিত করতে চান তবে আপনি 'অবজেক্ট' ডেটা টাইপ ব্যবহার করতে পারেন:

df['col'] = (
    df['col'].fillna(0)
    .astype(int)
    .astype(object)
    .where(df['col'].notnull())
)

এটি NaNs কে একটি পূর্ণসংখ্যার (কোন বিষয় নয়) দিয়ে প্রতিস্থাপিত করবে, int- এ রূপান্তর করবে, অবজেক্টে রূপান্তর করবে এবং শেষ পর্যন্ত NaN গুলি পুনরায় সন্নিবেশ করবে।


3

আপনি যদি আপনার সঞ্চিত ডেটা পরিবর্তন করতে পারেন, অনুপস্থিত জন্য একটি সেন্ডিনেল মান ব্যবহার করুন id। কলামের নাম দ্বারা অনুমিত একটি সাধারণ ব্যবহারের ক্ষেত্র, idএটি একটি পূর্ণসংখ্যা, শূন্যের চেয়ে কঠোরতর, আপনি 0প্রেরণেল মান হিসাবে ব্যবহার করতে পারেন যাতে আপনি লিখতে পারেন

if row['id']:
   regular_process(row)
else:
   special_process(row)

3

.dropna()NaN মান সহ সারিগুলি ফেলে দেওয়া যদি ঠিক হয় তবে আপনি ব্যবহার করতে পারেন ।

df = df.dropna(subset=['id'])

বিকল্পভাবে, ব্যবহার করুন .fillna()এবং .astype()মানগুলির সাথে NaN প্রতিস্থাপন করুন এবং সেগুলি ইনটে রূপান্তর করুন।

বড় সংখ্যার সিএসভি ফাইল প্রসেস করার সময় আমি এই সমস্যায় পড়েছিলাম, যখন তাদের মধ্যে কিছু অনুপস্থিত (এনএন) ছিল না। টাইপ হিসাবে ফ্লোট ব্যবহার করা কোনও বিকল্প ছিল না, কারণ আমি নির্ভুলতাটি looseিলা করতে পারি।

আমার সমাধানটি ছিল মধ্যবর্তী ধরণের হিসাবে স্ট্র ব্যবহার করা । তারপরে আপনি কোডটি পরে দয়া করে যেমন স্ট্রিংটি ইন্টিতে রূপান্তর করতে পারেন। আমি 0 এর সাথে NaN প্রতিস্থাপন করেছি, তবে আপনি কোনও মান বেছে নিতে পারেন।

df = pd.read_csv(filename, dtype={'id':str})
df["id"] = df["id"].fillna("0").astype(int)

উদাহরণস্বরূপ, এখানে একটি উদাহরণ কীভাবে ভাসমানগুলি যথাযথতাটি mayিলা করতে পারে:

s = "12345678901234567890"
f = float(s)
i = int(f)
i2 = int(s)
print (f, i, i2)

এবং আউটপুটটি হ'ল:

1.2345678901234567e+19 12345678901234567168 12345678901234567890

2

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

keep_df[col] = keep_df[col].apply(lambda x: None if pandas.isnull(x) else '{0:.0f}'.format(pandas.to_numeric(x)))

1

আমি পিএসপার্কের সাথে কাজ করে এই সমস্যাটি ছড়িয়েছি। যেহেতু এটি কোনও জাভিএম-তে চলমান কোডের জন্য অজগর সীমানা, এটির জন্য সুরক্ষা টাইপ দরকার এবং ইন্টের পরিবর্তে ফ্লোট ব্যবহার করা কোনও বিকল্প নয়। আমি ইস্যুটির চারপাশে এমন pd.read_csvএকটি ফাংশনে প্যান্ডাস মোড়কে কাজ করেছি যা ব্যবহারকারীর দ্বারা সংজ্ঞায়িত কলামগুলি প্রয়োজনীয় ধরণের castালার আগে ব্যবহারকারী-সংজ্ঞায়িত পূরণ মানগুলি পূরণ করবে। এখানে আমি ব্যবহার করে শেষ করেছি:

def custom_read_csv(file_path, custom_dtype = None, fill_values = None, **kwargs):
    if custom_dtype is None:
        return pd.read_csv(file_path, **kwargs)
    else:
        assert 'dtype' not in kwargs.keys()
        df = pd.read_csv(file_path, dtype = {}, **kwargs)
        for col, typ in custom_dtype.items():
            if fill_values is None or col not in fill_values.keys():
                fill_val = -1
            else:
                fill_val = fill_values[col]
            df[col] = df[col].fillna(fill_val).astype(typ)
    return df

1
import pandas as pd

df= pd.read_csv("data.csv")
df['id'] = pd.to_numeric(df['id'])

4
আপনি গ্রহণযোগ্য উত্তরে প্রস্তাবিত প্রস্তাবের চেয়ে এই সূত্রটি পছন্দ করেন এমন কোনও কারণ আছে কি? যদি তা হয় তবে সেই ব্যাখ্যাটি সরবরাহ করতে আপনার উত্তরটি সম্পাদনা করা দরকারী — এবং বিশেষত যেহেতু দশটি অতিরিক্ত উত্তর মনোযোগের জন্য প্রতিযোগিতা করছে since
জেরেমি ক্যানি

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

0

প্রথমে NaN থাকা সারিগুলি সরিয়ে ফেলুন। তারপরে অবশিষ্ট সারিগুলিতে পূর্ণসংখ্যা রূপান্তর করুন। সর্বশেষে সরানো সারিগুলি আবার sertোকান। আশা করি এটি কার্যকর হবে


-1

আপনার তারিখ কলাম ফর্ম্যাট 3312018.0 ধরে স্ট্রিং হিসাবে রূপান্তর করা উচিত 03/31/2018। এবং, কিছু রেকর্ড অনুপস্থিত বা 0 রয়েছে।

df['DateColumn'] = df['DateColumn'].astype(int)
df['DateColumn'] = df['DateColumn'].astype(str)
df['DateColumn'] = df['DateColumn'].apply(lambda x: x.zfill(8))
df.loc[df['DateColumn'] == '00000000','DateColumn'] = '01011980'
df['DateColumn'] = pd.to_datetime(df['DateColumn'], format="%m%d%Y")
df['DateColumn'] = df['DateColumn'].apply(lambda x: x.strftime('%m/%d/%Y'))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.