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


145

আমি 0 টির সাথে কোনও কলামের উপসেটের জন্য 0 এর সাথে কোনও পান্ডাস ডেটা ফ্রেমে কোনও মান পূরণ করার চেষ্টা করছি।

যখন আমি করি:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

আউটপুট:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

এটি প্রত্যেকের Noneসাথে প্রতিস্থাপন করে 0। আমি যা করতে চাই তা হ'ল কেবলমাত্র Noneকলামগুলিতে প্রতিস্থাপন করুন aএবং bতা নয় c

এটি করার সর্বোত্তম উপায় কী?

উত্তর:


219

আপনি আপনার পছন্দসই কলামগুলি নির্বাচন করতে পারেন এবং নিয়োগের মাধ্যমে এটি করতে পারেন:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

প্রত্যাশিত ফলাফল ফলাফল:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

হ্যাঁ, এটাই আমি চাই! ধন্যবাদ. এই জায়গাটি করার কোনও উপায়? আমার আসল ডেটাফ্রেমটি বেশ বড়।
Sait

1
আমি মনে করি না যে
এটির

4
df[['a', 'b']] = df[['a','b']].fillna(value=0)
লকটি

2
@ এডচাম এটি কী কোনও অস্থায়ী ডেটা ফ্রেম তৈরি করে না এবং তাই করার জন্য আরও মেমরির প্রয়োজন? (আমি সময় জটিলতা চেয়ে পুনরুদ্ধার সম্পর্কে আরও উদ্বিগ্ন।)
Sait

7
অনেক ক্রিয়াকলাপের জন্য, inplaceএখনও একটি অনুলিপিতে কাজ করবে। আমি জানি না এটা কেস এর জন্য কিনা fillnaএই উত্তরটি পান্ডাস কোর বিকাশকারীদের একজনের কাছ থেকে দেখুন ।
রুট

85

ব্যবহার করে আপনি করতে পারেন dict, fillnaবিভিন্ন কলামের জন্য বিভিন্ন মান

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

পরে এটি বরাদ্দ

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
সত্যিই দুর্দান্ত, আপনি চাইলে যে ডিকটি ব্যবহার করতে পারেন তার জন্য বিটিডাব্লু fromkeys, +1
ইউ 10-ফরোয়ার্ড

1
উত্তর / উদাহরণটি আরও স্পষ্ট হবে যদি তা প্রকৃতপক্ষে বিভিন্ন কলামের জন্য বিভিন্ন মান দেখায়।
RufusVS

@ রুফাসভিএস ঠিক আছে, তবে এখনও অপের প্রত্যাশিত আউটপুটটি মেলানোর চেষ্টা করুন
YOBEN_S

1
এটিই উত্তম সমাধান যা গ্রহণযোগ্য উত্তর, কারণ এটি শৃঙ্খলাবদ্ধ ইন্ডেক্সিং সমস্যাগুলি এড়িয়ে চলে, যেমন যদি এটি ব্যবহার করা হয়df.fillna({'a':0,'b':0}, inplace=True)
অ্যালেক্স

19

আপনি ওয়েনের সমাধান এবং ইনপ্লেস = সত্য ব্যবহার করে অবজেক্টটির অনুলিপি তৈরি করা এড়াতে পারেন can

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

যা ফলন দেয়:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
যদিও এটি সঠিক, একটি অনুলিপি এড়িয়ে চলা আরও ভাল নয়
জেপিপি

7

আপনি কীভাবে এক লাইনে এটি সব করতে পারেন তা এখানে:

df[['a', 'b']].fillna(value=0, inplace=True)

ব্রেকডাউন: df[['a', 'b']]আপনি যে কলামগুলির জন্য NaN মান পূরণ করতে চান তা নির্বাচন করে, value=0এটি শূন্যের সাথে NaN পূরণ করতে বলে inplace=Trueএবং অবজেক্টের অনুলিপি না রেখে পরিবর্তনগুলি স্থায়ী করে দেবে।


7

উপরের উত্তরটি ব্যবহার করা একটি ডিএফ স্লাইসের অনুলিপিটিতে পরিবর্তন আনার বিষয়ে একটি সতর্কতা তৈরি করে। আপনার অন্যান্য কলাম রয়েছে বলে ধরে নেওয়া, এটি করার আরও ভাল উপায় একটি অভিধান পাস করা:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)


3

বা এর মতো কিছু:

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

এবং যদি আরও থাকে:

for i in your_list:
    df.loc[df[i].isnull(),i]=0

0

কখনও কখনও এই বাক্য গঠন কাজ করবে না:

df[['col1','col2']] = df[['col1','col2']].fillna()

পরিবর্তে নিম্নলিখিত ব্যবহার করুন:

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