কলাম মানের উপর ভিত্তি করে পান্ডাসে ডেটা ফ্রেম সারি মোছা


506

আমার কাছে নিম্নলিখিত ডেটা ফ্রেম রয়েছে:

             daysago  line_race rating        rw    wrating
 line_date                                                 
 2007-03-31       62         11     56  1.000000  56.000000
 2007-03-10       83         11     67  1.000000  67.000000
 2007-02-10      111          9     66  1.000000  66.000000
 2007-01-13      139         10     83  0.880678  73.096278
 2006-12-23      160         10     88  0.793033  69.786942
 2006-11-09      204          9     52  0.636655  33.106077
 2006-10-22      222          8     66  0.581946  38.408408
 2006-09-29      245          9     70  0.518825  36.317752
 2006-09-16      258         11     68  0.486226  33.063381
 2006-08-30      275          8     72  0.446667  32.160051
 2006-02-11      475          5     65  0.164591  10.698423
 2006-01-13      504          0     70  0.142409   9.968634
 2006-01-02      515          0     64  0.134800   8.627219
 2005-12-06      542          0     70  0.117803   8.246238
 2005-11-29      549          0     70  0.113758   7.963072
 2005-11-22      556          0     -1  0.109852  -0.109852
 2005-11-01      577          0     -1  0.098919  -0.098919
 2005-10-20      589          0     -1  0.093168  -0.093168
 2005-09-27      612          0     -1  0.083063  -0.083063
 2005-09-07      632          0     -1  0.075171  -0.075171
 2005-06-12      719          0     69  0.048690   3.359623
 2005-05-29      733          0     -1  0.045404  -0.045404
 2005-05-02      760          0     -1  0.039679  -0.039679
 2005-04-02      790          0     -1  0.034160  -0.034160
 2005-03-13      810          0     -1  0.030915  -0.030915
 2004-11-09      934          0     -1  0.016647  -0.016647

line_raceসমান যেখানে সারি সরাতে হবে 0। এটি করার সবচেয়ে দক্ষ উপায় কোনটি?


উত্তর:


873

আমি যদি সঠিকভাবে বুঝতে পারি তবে এটি এতটা সহজ হওয়া উচিত:

df = df[df.line_race != 0]

16
dfবড় হলে এই বেশি মেমোরি খরচ হবে ? বা, আমি এটি জায়গায় জায়গায় করতে পারি?
জিয়ুয়াং

10
এটি কেবল df2M সারিগুলির সাথে চালিয়েছে এবং এটি বেশ দ্রুত গতিতে চলেছে।
ভয়ঙ্কর

46
@vfxGer কলামে যদি 'লাইন রেস' এর মতো জায়গা থাকে তবে আপনি ঠিক করতে পারেনdf = df[df['line race'] != 0]
পল

3
আমরা যদি এই কমান্ডটি সংশোধন করব কীভাবে যদি আমরা পুরো সারিটি মুছে ফেলতে চাই তবে প্রশ্নটির মান row সারির কোনও কলামে পাওয়া যায়?
অ্যালেক্স

3
ধন্যবাদ! ফিউইউউ, আমার জন্য এটি হতে হয়েছিলdf=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]
সিটিএনরম্যান

181

তবে ভবিষ্যতের বাইপাসকারীদের জন্য আপনি উল্লেখ করতে পারেন যে / নিখোঁজ মানের df = df[df.line_race != 0]জন্য ফিল্টার করার চেষ্টা করার সময় কিছুই হয় না None

কাজ করে:

df = df[df.line_race != 0]

কিছু করে না:

df = df[df.line_race != None]

কাজ করে:

df = df[df.line_race.notnull()]

4
আমরা কলামের নামটি না জানলে কীভাবে করব?
পীযূষ এস ওয়ানারে

করতে পারে df = df[df.columns[2].notnull()]তবে একরকম বা অন্য কোনও উপায়ে আপনাকে কোনওভাবে কলামটি সূচী করতে সক্ষম হতে হবে।
ইরাকাল্পার

1
df = df[df.line_race != 0]সারিগুলি ড্রপ করে তবে সূচকটি পুনরায় সেট করে না। সুতরাং আপনি যখন df এ অন্য সারি যুক্ত করবেন এটি শেষে যুক্ত নাও হতে পারে। আমি সেই অপারেশনের পরে df = df.reset_index(drop=True)
সূচিটি

==অপারেটরের সাথে আরম্ভ করার জন্য আপনার কখনই তুলনা করা উচিত নয় । stackoverflow.com/questions/3257919/...
Bram স্বাগতম Vanroy

40

এটি করার সর্বোত্তম উপায় হ'ল বুলিয়ান মাস্কিং সহ:

In [56]: df
Out[56]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698
11  2006-01-13      504          0      70  0.142    9.969
12  2006-01-02      515          0      64  0.135    8.627
13  2005-12-06      542          0      70  0.118    8.246
14  2005-11-29      549          0      70  0.114    7.963
15  2005-11-22      556          0      -1  0.110   -0.110
16  2005-11-01      577          0      -1  0.099   -0.099
17  2005-10-20      589          0      -1  0.093   -0.093
18  2005-09-27      612          0      -1  0.083   -0.083
19  2005-09-07      632          0      -1  0.075   -0.075
20  2005-06-12      719          0      69  0.049    3.360
21  2005-05-29      733          0      -1  0.045   -0.045
22  2005-05-02      760          0      -1  0.040   -0.040
23  2005-04-02      790          0      -1  0.034   -0.034
24  2005-03-13      810          0      -1  0.031   -0.031
25  2004-11-09      934          0      -1  0.017   -0.017

In [57]: df[df.line_race != 0]
Out[57]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698

আপডেট: এখন যে পান্ডা 0.13 শেষ, এটি করার অন্য একটি উপায় df.query('line_race != 0')


df.query দেখতে খুব দরকারী! ধন্যবাদ! pandas.pydata.org/pandas-docs/version/0.13.1/generated/…
কল্পনাপ্রসূত

14
জন্য ভাল আপডেট query। এটি আরও সমৃদ্ধ নির্বাচনের মানদণ্ডের জন্য অনুমতি দেয় (যেমন df.query('variable in var_list')'var_list' পছন্দসই মানের তালিকার মতো সেট-এর মতো ক্রিয়াকলাপ )
ফিলিপ

1
কলামের নামে একটি জায়গা থাকলে কীভাবে এটি অর্জন করা যায়?
iNoob

2
queryকলামের নামটিতে একটি স্থান থাকলে খুব কার্যকর নয়।
ফিলিপ ক্লাউড

3
আমি এই জাতীয় কিছু দিয়ে শিরোনামগুলিতে ফাঁকা স্থান এড়াতে চাইdf = df.rename(columns=lambda x: x.strip().replace(' ','_'))
বিজ্ঞানী

39

কেবলমাত্র অন্য সমাধান যুক্ত করতে, বিশেষত দরকারী যদি আপনি নতুন পান্ডাস মূল্যায়নকারী ব্যবহার করেন তবে অন্যান্য সমাধানগুলি মূল পান্ডাগুলি প্রতিস্থাপন করবে এবং মূল্যায়নকারীদের হারাবে

df.drop(df.loc[df['line_race']==0].index, inplace=True)

1
সূচী লেখার উদ্দেশ্য এবং স্থান কী। কেউ দয়া করে ব্যাখ্যা করতে পারেন?
heman123


আমি মনে করি যে .reset_index()কেউ যদি সূচী অ্যাক্সেসরগুলি ব্যবহার করে শেষ করে তবে আমাদেরও প্রয়োজন হবে
আয়ুষ

15

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

df[(df.line_race != 0) & (df.line_race != 10)]

0 এবং 10 এর মান সহ সমস্ত সারি বাদ দিতে line_race


14

প্রদত্ত উত্তরটি সঠিক তবে তবুও উপরে কেউ বলেছেন যে আপনি df.query('line_race != 0')আপনার সমস্যার উপর নির্ভর করে যা ব্যবহার করতে পারেন তা তাত্পর্যপূর্ণ। অত্যন্ত সুপারিশ.


বিশেষত সহায়ক যদি আপনার DataFrameমতো আমার মতো দীর্ঘ পরিবর্তনশীল নাম থাকে (এবং উদাহরণস্বরূপ dfব্যবহৃত ব্যবহারের তুলনায় আমি অনুমান করার উদ্যোগ নেব ), কারণ আপনাকে কেবল এটি একবার লিখতে হবে।
আইজোসেফ

9

যদিও প্রিভিউ উত্তরটি আমি যা করতে যাচ্ছি তার প্রায় অনুরূপ, তবে সূচী পদ্ধতিটি ব্যবহার করার জন্য অন্য সূচীকরণ পদ্ধতি ব্যবহারের প্রয়োজন নেই l লোক ()। এটি যেমন একটি অনুরূপ তবে সুনির্দিষ্টভাবে করা যেতে পারে

df.drop(df.index[df['line_race'] == 0], inplace = True)

1
বড় ডেটাসেট বা মেমরির প্রতিবন্ধকতার জন্য স্থানে সমাধান আরও ভাল। +1
ডাভমর

3

এটি করার আরেকটি উপায়। কোডটি অন্য উত্তরে বর্ণিত কোডের চেয়ে কিছুটা জটিল দেখতে দেখতে সবচেয়ে কার্যকর উপায় নাও হতে পারে তবে একই জিনিস করার বিকল্প পদ্ধতিতে এখনও।

  df = df.drop(df[df['line_race']==0].index)

0

সমস্ত কলামে ডেটাফ্রেমের জন্য কেবলমাত্র অন্যভাবে প্রসারিত করা হয়েছে:

for column in df.columns:
   df = df[df[column]!=0]

উদাহরণ:

def z_score(data,count):
   threshold=3
   for column in data.columns:
       mean = np.mean(data[column])
       std = np.std(data[column])
       for i in data[column]:
           zscore = (i-mean)/std
           if(np.abs(zscore)>threshold):
               count=count+1
               data = data[data[column]!=i]
   return data,count
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.