একটি পান্ডাস ডেটা ফ্রেমে সারিগুলির একটি উপসেট পরিবর্তন করা


143

ধরুন আমার কাছে দুটি কলাম, এ এবং বি সহ একটি পান্ডাস ডেটা ফ্রেম রয়েছে আমি এই ডেটাফ্রেমটি সংশোধন করতে চাই (বা একটি অনুলিপি তৈরি করব) যাতে A সর্বদা যখনই 0 থাকে তখন আমি কীভাবে এটি অর্জন করব?

আমি নিম্নলিখিত চেষ্টা করেছিলাম

df['A'==0]['B'] = np.nan

এবং

df['A'==0]['B'].values.fill(np.nan)

সাফল্য ছাড়া.


আপনি যদি খুব দ্রুত সমাধানের সন্ধান করতে চান তবে নীচের এই দ্রষ্টব্যতে whereদেখা গেছে নম্পপি ব্যবহার করুন
টেড পেট্রো

উত্তর:


243

.locলেবেল ভিত্তিক সূচকের জন্য ব্যবহার করুন :

df.loc[df.A==0, 'B'] = np.nan

df.A==0অভিব্যক্তি একটি বুলিয়ান সিরিজ তৈরি করে যে ইনডেক্স সারি, 'B'কলাম নির্বাচন করে। আপনি এটি কোনও কলামের উপসেটটি রূপান্তর করতেও ব্যবহার করতে পারেন, যেমন:

df.loc[df.A==0, 'B'] = df.loc[df.A==0, 'B'] / 2

কেন কাজ করে তা সঠিকভাবে জানার জন্য আমি পান্ডাস ইন্টার্নাল সম্পর্কে পর্যাপ্ত পরিমাণে জানি না, তবে মূল সমস্যাটি হ'ল কখনও কখনও ডেটাফ্রেমে সূচিকাগুলি ফলাফলের একটি অনুলিপি প্রদান করে এবং কখনও কখনও এটি আসল বস্তুর উপর দৃষ্টিভঙ্গি দেয়। এখানে ডকুমেন্টেশন অনুসারে , এই আচরণ অন্তর্নিহিত নম্পি আচরণের উপর নির্ভর করে। আমি খুঁজে পেয়েছি যে একটি ক্রিয়াকলাপে ([এক] [দুই] এর চেয়ে) সমস্ত কিছু অ্যাক্সেস করা সেটিংয়ের জন্য কাজ করার সম্ভাবনা বেশি।


এর দ্বিতীয় অংশটি এমন একটি প্রশ্নের উত্তরের উত্তর যা এমনকি জিজ্ঞাসা করা হয়নি ;-) আমি ভাবছি যে এটি এখনও প্রামাণিক পান্ডার উত্তর কিনা, বিশেষভাবে খ / সি এটি একটি সুস্পষ্ট ডিআরওয়াই লঙ্ঘন, যদিও আমি ধরে নিই যে এটি রয়েছে পান্ডাস ইন্টার্নালগুলির প্রতিবন্ধকতাগুলি দেখে ডিআরওয়াই লঙ্ঘন করার দরকার আছে? (আমি আরও বিস্তারিতভাবে ঠিক এই ধরণের প্রশ্নটি পোস্ট করতে পারি, তবে আমি এটি করার আগে আপনার কাছে একটি দ্রুত উত্তর আছে কিনা তা দেখতে চেয়েছি)
জন

কলামের নাম নেই এমন একটি ডেটাফ্রেম কীভাবে সাবসেট করবেন, কীভাবে কেবল সূচক দ্বারা ডিএফ সাবসেট করবেন? df.loc [df [0] == 0] কাজ করে না ... বিকল্প কি? আপনাকে ধন্যবাদ
amipro

89

অ্যাডভান্সড ইনডেক্সিংয়ের পান্ডাস ডক্স থেকে এখানে :

বিভাগটি আপনার যা প্রয়োজন ঠিক তা ব্যাখ্যা করবে! দেখা যাচ্ছে df.loc(যেমন .ix হ্রাস করা হয়েছে - যেমনটি নীচে দেখানো হয়েছে) একটি ডাটাফ্রেমের শীতল কাটা / ডাইসিংয়ের জন্য ব্যবহার করা যেতে পারে। এবং. এটি জিনিস সেট করতে ব্যবহার করা যেতে পারে।

df.loc[selection criteria, columns I want] = value

সুতরাং ব্রেনের উত্তর বলছে 'আমাকে যেখানে যেখানে df.A == 0কলাম নির্বাচন করুন Bএবং সেট করে রেখেছেন' সেই সব জায়গাগুলি আমাকে সন্ধান করুন np.nan'


2
আপনি আমার দিন তৈরি করেছেন। পরিষ্কার ব্যাখ্যা।
টুইনপেনগুইনস

1
হ্যাঁ, কোনওভাবে loc[selection criteria, columns I want]নিখুঁতভাবে আপনার মনে আটকে আছে ...
EmEs

29

পান্ডাস থেকে শুরু করে 0.20 ix হ্রাস করা হয় । সঠিক উপায় df.loc ব্যবহার করা হয়

এখানে একটি কাজের উদাহরণ

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
   A   B
0  0 NaN
1  1   0
2  0 NaN
>>> 

ব্যাখ্যা:

এখানে ডকটিতে বর্ণিত হিসাবে , .loc প্রাথমিকভাবে লেবেল ভিত্তিক, তবে এটি বুলিয়ান অ্যারের সাথেও ব্যবহৃত হতে পারে

সুতরাং, আমরা উপরে যা করছি তা প্রয়োগ করছে df.loc[row_index, column_index]:

  • locএমন একটি মুখোশ হিসাবে বুলিয়ান অ্যারে নিতে পারে তা আবিষ্কার করে যা পান্ডগুলিকে জানিয়েছে যে সারিগুলির মধ্যে উপসেট আমরা পরিবর্তন করতে চাইrow_index
  • আসলে শোষণ locএছাড়াও কলাম ট্যাগ ব্যবহার নির্বাচন করতে ভিত্তিক লেবেল 'B'মধ্যেcolumn_index

আমরা যৌক্তিক, শর্ত বা যে কোনও ক্রিয়াকলাপ ব্যবহার করতে পারি যা বুলিয়ানগুলির অ্যারে তৈরি করতে সিরিজ বুলিয়েন্সকে দেয়। উপরের উদাহরণে, আমরা rowsএমন কোনওটি চাই 0যা এর সাথে আমরা ব্যবহার df.A == 0করতে পারি, আপনি নীচের উদাহরণে দেখতে পারেন, এটি বুলিয়ানগুলির একটি সিরিজ দেয়।

>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df 
   A  B
0  0  2
1  1  0
2  0  5
>>> df.A == 0 
0     True
1    False
2     True
Name: A, dtype: bool
>>> 

তারপরে, আমরা প্রয়োজনীয় সারিগুলি নির্বাচন এবং সংশোধন করার জন্য উপরের বুলিয়ানগুলির অ্যারে ব্যবহার করি:

>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
   A   B
0  0 NaN
1  1   0
2  0 NaN

আরও তথ্যের জন্য এখানে উন্নত সূচক ডকুমেন্টেশন চেক করুন


11

ব্যাপক গতির বৃদ্ধির জন্য, NumPy এর যেখানে ফাংশন রয়েছে তা ব্যবহার করুন।

সেটআপ

কিছু শূন্য সহ 100,000 সারি সহ একটি দ্বি-কলাম ডেটাফ্রেম তৈরি করুন।

df = pd.DataFrame(np.random.randint(0,3, (100000,2)), columns=list('ab'))

সঙ্গে দ্রুত সমাধান numpy.where

df['b'] = np.where(df.a.values == 0, np.nan, df.b.values)

সময়

%timeit df['b'] = np.where(df.a.values == 0, np.nan, df.b.values)
685 µs ± 6.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.loc[df['a'] == 0, 'b'] = np.nan
3.11 ms ± 17.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

নম্পি whereপ্রায় 4x দ্রুত


আমি এটি সম্পর্কে কৌতূহল ছিলাম তাই আমি নিজে এটি পরীক্ষা করেছিলাম এবং অন্যান্য পরামিতিগুলি ব্যবহার করে পার্থক্য আরও বেশি ছিল। Np.nan এর পরিবর্তে 0 ইন্টিজার দিয়ে পূর্ণসংখ্যার সাথে প্রতিস্থাপনে নিম্পি প্রায় 10 গুণ বেশি দ্রুত ছিল। আমি ভাবছি অতিরিক্ত সময় কি লাগে।
আলেকজান্ডার

এটি ব্যবহার করার জন্য প্রয়োজনীয় .valuesমধ্যে np.where(df.a.values == 0, np.nan, df.b.values)? দেখতেও কি np.where(df.a == 0, np.nan, df.b)কাজ করে?
এইচএসএল

4

একাধিক কলামগুলি নামী অ্যারেতে রূপান্তর করে এটি ব্যবহার করে .values:

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