পান্ডাস ডেটা ফ্রেমে সমস্ত শূন্যের সাথে সারি ফেলে দিন


108

আমি pandas dropna()কয়েকটি বা সমস্ত কলামের NAগুলি হিসাবে সারণি সরাতে কার্যকারিতাটি ব্যবহার করতে পারি । সমস্ত কলামের মান 0 থাকার সাথে সারিগুলি ফেলে দেওয়ার জন্য কি কোনও সমতুল্য কাজ রয়েছে?

P   kt  b   tt  mky depth
1   0   0   0   0   0
2   0   0   0   0   0
3   0   0   0   0   0
4   0   0   0   0   0
5   1.1 3   4.5 2.3 9.0

এই উদাহরণে, আমরা ডেটা ফ্রেম থেকে প্রথম 4 টি সারি বাদ দিতে চাই।

ধন্যবাদ!


কেবল স্পষ্ট করে বলতে গেলে, এটি দুটি প্রশ্ন। এক, সমস্ত মান সহ 0 হিসাবে কলামগুলি ড্রপ করতে। তবে ড্রপনা () সমতুল্য একটি ক্রিয়াকলাপের ক্ষেত্রেও যে কোনও মান সহ 0 টি কলামগুলি ড্রপ করবে
আলকেমি

উত্তর:


117

দেখা যাচ্ছে এটি ভালভাবে একটি ভেক্টরাইজড ফ্যাশনে প্রকাশ করা যেতে পারে:

> df = pd.DataFrame({'a':[0,0,1,1], 'b':[0,1,0,1]})
> df = df[(df.T != 0).any()]
> df
   a  b
1  0  1
2  1  0
3  1  1

7
ভাল df = df[(df.T != 0).any()]
লাগছে

4
@ আকাওয়াল আরও অনেক ভাল!
U2EF1

4
কেবল একটি নোট: ওপি ছাড়তে চেয়েছিল rows with all columns having value 0, তবে একটি allপদ্ধতি অনুমান করতে পারে ।
paulochf

4
এই উত্তরগুলির সমস্তটি ব্যাখ্যা করে যে কীভাবে আমরা সমস্ত শূন্যের সাথে সারিগুলি ফেলে দিতে পারি, তবে, আমি প্রথম কলামে 0 দিয়ে সারিগুলি ফেলে দিতে চেয়েছিলাম। এই পোস্টে সমস্ত আলোচনা এবং উত্তরের সাহায্যে, আমি df.loc [df.iloc [:, 0]! = 0] করে এটি করেছি। শুধু ভাগ করতে চেয়েছিলেন কারণ এই সমস্যাটি এই প্রশ্নের সাথে সম্পর্কিত !!
হেমন্ত

4
ট্রান্সপোজ প্রয়োজন হয় না, যে কোনও () প্যারামিটার হিসাবে অক্ষ নিতে পারে। সুতরাং এটি কাজ করে: df = df [df.any (অক্ষ = 1)]
রাহুল ঝা

134

এক রৈখিক. কোনও ট্রান্সপোজের প্রয়োজন নেই:

df.loc[~(df==0).all(axis=1)]

এবং যারা প্রতিসাম্য পছন্দ করেন তাদের পক্ষে এটিও কার্যকর হয় ...

df.loc[(df!=0).any(axis=1)]

4
সংক্ষিপ্ততা জন্য (এবং, আমার মতে, উদ্দেশ্যের স্বচ্ছতা) এই এবং Akavall এর মন্তব্য মেশা: df.loc[(df != 0).any(1)]। দলবদ্ধভাবে সম্পাদিত কর্ম!
ড্যান অ্যালান

4
+1, 30% দ্রুত যা ট্রান্সপোজ করে - 491 থেকে 614 মাইক্রোসিস এবং আমি axis=1স্পষ্ট হওয়ার জন্য পছন্দ করি ; আমার মতে আরও
অজগর

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

এটি আমার পক্ষে কাজ করে না, তবে আমাকে ঠিক df
একইটি

এর কোনও 'ইনপ্লেস' সংস্করণ আছে? আমি দেখতে পাচ্ছি যে ওপি অনুরোধের সাথে একটি ডিএফ-এ সারিগুলি ফেলে দেওয়ার জন্য এটি ড্রপনা () এর আসল সমতুল্য হিসাবে কোনও জিরো দিয়ে সারিগুলি ফেলে দেওয়া df = df.loc[(df!=0).all(axis=1)]এবং হওয়া দরকার df = df.loc[(df!=0).any(axis=1)]
আলকেমি

20

আমি এই প্রশ্নটি মাসে একবার সম্পর্কে সন্ধান করি এবং সর্বদা মন্তব্যগুলি থেকে সেরা উত্তরটি বের করতে হবে:

df.loc[(df!=0).any(1)]

ধন্যবাদ ড্যান অ্যালান!


4
কোনও খননের প্রয়োজন নেই। @ 8one6 এটি তার উত্তরগুলিতে ২০১৪ সালে ফিরে এসেছিল, যে অংশটি বলে: "এবং যারা প্রতিসাম্য পছন্দ করেন তাদের জন্য ..."।
রাহুল মুরমুরিয়া

16

শূন্যগুলি এর সাথে প্রতিস্থাপন করুন nanএবং তারপরে সমস্ত এন্ট্রি সহ সারিগুলি ফেলে দিন nan। এর পরে nanজিরো দিয়ে প্রতিস্থাপন করুন ।

import numpy as np
df = df.replace(0, np.nan)
df = df.dropna(how='all', axis=0)
df = df.replace(np.nan, 0)

4
যদি আপনার ডেটাতে কোনও পূর্ব-বিদ্যমান এনএন-এস থাকে তবে এটি ব্যর্থ হবে।
ওমরবি

13

আমি মনে করি এই সমাধানটি সবচেয়ে সংক্ষিপ্ত:

df= df[df['ColName'] != 0]

4
এবং এর জায়গাটিও!
ম্যাক্স ক্লিনার

4
পরিবর্তনশীল পুনরায় নির্ধারণের শক্তি কর্মদক্ষতার দ্বারা @MaxKleiner inplace
Lukas

7

বিশেষত বৃহত্তর ডেটা সেটগুলির জন্য এটি দেখার সময় আমি বেশ কয়েকটি সমাধান খুঁজে পেয়েছি বলে মনে হয়েছিল:

df[(df.sum(axis=1) != 0)]       # 30% faster 
df[df.values.sum(axis=1) != 0]  # 3X faster 

@ ইউ 2 ই এফ 1 এর উদাহরণ সহকারে অবিরত:

In [88]: df = pd.DataFrame({'a':[0,0,1,1], 'b':[0,1,0,1]})

In [91]: %timeit df[(df.T != 0).any()]
1000 loops, best of 3: 686 µs per loop

In [92]: df[(df.sum(axis=1) != 0)]
Out[92]: 
   a  b
1  0  1
2  1  0
3  1  1

In [95]: %timeit df[(df.sum(axis=1) != 0)]
1000 loops, best of 3: 495 µs per loop

In [96]: %timeit df[df.values.sum(axis=1) != 0]
1000 loops, best of 3: 217 µs per loop

আরও বড় ডেটাসেটে:

In [119]: bdf = pd.DataFrame(np.random.randint(0,2,size=(10000,4)))

In [120]: %timeit bdf[(bdf.T != 0).any()]
1000 loops, best of 3: 1.63 ms per loop

In [121]: %timeit bdf[(bdf.sum(axis=1) != 0)]
1000 loops, best of 3: 1.09 ms per loop

In [122]: %timeit bdf[bdf.values.sum(axis=1) != 0]
1000 loops, best of 3: 517 µs per loop

আপনার সারিতে যদি -1 এবং 1 থাকে তবে খারাপ জিনিসগুলি ঘটে?
Rhys Ulerich

অবশ্যই, আপনি যদি সমান সারি 0 অবধি যোগ করেন তবে যোগফলটি কাজ করবে না এটি এখানে সামান্য ধীর গতির জন্য একটি দ্রুত কাজ করা আছে: df[~(df.values.prod(axis=1) == 0) | ~(df.values.sum(axis=1)==0)]
ক্লার্ক

প্রোড () ফাংশন কোনও কিছুই সমাধান করে না। আপনার যদি সারিটিতে 0 থাকে তবে 0 ফিরে আসবে যদি আপনার এইরকম একটি সারি পরিচালনা করতে হয়: [-1, -0.5, 0, 0.5, 1], আপনার সমাধানগুলির কোনওটিও কাজ করবে না।
রাহুল মুরমুরিয়া

এখানে একটি সঠিক সংস্করণ যা গৃহীত উত্তরের চেয়ে 3x দ্রুত কাজ করে:bdf[np.square(bdf.values).sum(axis=1) != 0]
রাহুল মুরমুরিয়া

5
import pandas as pd

df = pd.DataFrame({'a' : [0,0,1], 'b' : [0,0,-1]})

temp = df.abs().sum(axis=1) == 0      
df = df.drop(temp)

ফলাফল:

>>> df
   a  b
2  1 -1

1 কলামের ডেটাফ্রেমে আমার পক্ষে কাজ করেনি। পেয়েছিValueError: labels [True ... ] not contained in matrix
আনফুন বিড়াল

পরিবর্তে df = df.drop(temp)ব্যবহারের জন্যdf = df.drop(df[temp].index)
ডগলাস ফেরেরিরা

3

lambdaপ্রদত্ত সারির সমস্ত মানগুলি কিনা তা পরীক্ষা করতে আপনি একটি দ্রুত ফাংশন ব্যবহার করতে পারেন 0। তারপরে আপনি সেই প্রয়োগের ফলাফলটি lambdaকেবল সেই সারিগুলির সাথে মেলে বা এই শর্তটির সাথে মেলে না এমনগুলি বেছে নেওয়ার উপায় হিসাবে ব্যবহার করতে পারেন :

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randn(5,3), 
                  index=['one', 'two', 'three', 'four', 'five'],
                  columns=list('abc'))

df.loc[['one', 'three']] = 0

print df
print df.loc[~df.apply(lambda row: (row==0).all(), axis=1)]

উৎপাদনের:

              a         b         c
one    0.000000  0.000000  0.000000
two    2.240893  1.867558 -0.977278
three  0.000000  0.000000  0.000000
four   0.410599  0.144044  1.454274
five   0.761038  0.121675  0.443863

[5 rows x 3 columns]
             a         b         c
two   2.240893  1.867558 -0.977278
four  0.410599  0.144044  1.454274
five  0.761038  0.121675  0.443863

[3 rows x 3 columns]

1

অন্য বিকল্প:

# Is there anything in this row non-zero?
# df != 0 --> which entries are non-zero? T/F
# (df != 0).any(axis=1) --> are there 'any' entries non-zero row-wise? T/F of rows that return true to this statement.
# df.loc[all_zero_mask,:] --> mask your rows to only show the rows which contained a non-zero entry.
# df.shape to confirm a subset.

all_zero_mask=(df != 0).any(axis=1) # Is there anything in this row non-zero?
df.loc[all_zero_mask,:].shape


0

আমার জন্য এই কোড: কার্যকর df.loc[(df!=0).any(axis=0)] হয়নি। এটি সঠিক ডেটাসেটটি ফিরিয়ে দিয়েছে returned

পরিবর্তে, আমি df.loc[:, (df!=0).any(axis=0)]ডেটাসেটে 0 টি মান সহ সমস্ত কলাম ব্যবহার করেছি এবং ফেলেছি

ফাংশনটি .all()সমস্ত কলামগুলিকে বাদ দিয়েছে যাতে আমার ডেটাসেটে কোনও শূন্য মান রয়েছে।



-2

যে কোনও সারিতে 0 টি মান সহ সমস্ত কলাম ড্রপ করতে:

new_df = df[df.loc[:]!=0].dropna()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.