পান্ডাস ডেটা ফ্রেমে কীভাবে NaN এ সেল স্থাপন করবেন


105

আমি NaN এর দ্বারা ডেটাফ্রেমের কলামে খারাপ মানগুলি প্রতিস্থাপন করতে চাই।

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

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


আমার মনে হচ্ছে শিরোনামটি বিভ্রান্তিকর। সমস্যাটি এমন নয় যে আপনি নিজের ডেটা ফ্রেমে NaN চান। সমস্যাটি হ'ল আপনি "একটি ডেটা ফ্রেমের স্লাইসের একটি অনুলিপি সেট করার চেষ্টা করছেন"।
টিপিওম

উত্তর:


127

শুধু ব্যবহার করুন replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

আপনি যা চেষ্টা করছেন তাকে চেইন ইন্ডেক্সিং বলা হয়: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

আপনি locআসল ডিএফ-এ পরিচালনা করছেন তা নিশ্চিত করতে আপনি ব্যবহার করতে পারেন :

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

14

ব্যবহার replaceকরার সময় সমস্যার সমাধান হচ্ছে বলে মনে হচ্ছে, আমি একটি বিকল্প প্রস্তাব করতে চাই। কলামে সংখ্যাসূচক এবং কিছু স্ট্রিং মানগুলির মিশ্রণ নিয়ে সমস্যা, এনপি.নান দিয়ে স্ট্রিং প্রতিস্থাপন না করে, পুরো কলামটি যথাযথ করতে। আমি বাজি ধরব যে মূল কলামটি সম্ভবত কোনও বস্তুর ধরণের of

Name: y, dtype: object

আপনার সত্যিকারের যা দরকার তা হ'ল এটি একটি সংখ্যাসূচক কলাম তৈরি করা (এটির যথাযথ প্রকার থাকবে এবং এটি বেশ দ্রুত হবে), এনএএন দ্বারা প্রতিস্থাপিত সমস্ত অ-সংখ্যাসূচক মানগুলি।

সুতরাং, ভাল রূপান্তর কোড হবে

pd.to_numeric(df['y'], errors='coerce')

errors='coerce'স্ট্রিংগুলিকে জোর করে নির্দিষ্ট করুন যাতে একটি এনএন হয়ে ওঠার জন্য একটি সংখ্যার মানকে পার্স করা যায় না। কলামের ধরণ হবে

Name: y, dtype: float64

10

আপনি প্রতিস্থাপন ব্যবহার করতে পারেন:

df['y'] = df['y'].replace({'N/A': np.nan})

এর জন্য inplaceপ্যারামিটার সম্পর্কে সচেতন হন replace। আপনি যেমন কিছু করতে পারেন:

df.replace({'N/A': np.nan}, inplace=True)

এটি অনুলিপি তৈরি না করে ডিএফ-এর সমস্ত দৃষ্টান্ত প্রতিস্থাপন করবে।

একইভাবে, আপনি যদি অন্য ধরণের অজানা মানগুলিতে চলে যান যেমন খালি স্ট্রিং বা কোনও মান নয়:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

তথ্যসূত্র: পান্ডাস সর্বশেষ - প্রতিস্থাপন করুন


3

পান্ডাস ১.০.০ অনুসারে, আপনার ডেটাফ্রেমে নাল মান তৈরি করতে আপনাকে আর ছদ্মবেশ ব্যবহার করার দরকার নেই। পরিবর্তে আপনি কেবল পান্ডাস.এনএ ব্যবহার করতে পারেন (যা টাইপ পান্ডাস।


যদিও এটি ওপির সমস্যার সমাধান করে না, আমি উর্ধ্বগতিতে কারণ এটি শিরোনামে প্রশ্নের উত্তরটি দিয়েছে।
টিপিওম

1
df.loc[df.y == 'N/A',['y']] = np.nan

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


0

আপনি এই স্নিপেট চেষ্টা করতে পারেন।

[১]]: মাইডেটা = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'এন / এ', '13', ' 15 ',' এন / এ ']}
[17] এ: ডিএফ = পিডি.ডাটা ফ্রেম (মাইডাটা)

[18] এ: df.y [df.y == "এন / এ"] = এনপি.নান

আউট [19]: ডিএফ 
    xy
0 10 12
1 50 11
2 18 NAN
3 32 13
4 47 15
5 20 এনএএন

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