DataFrame-rij verwijderen in Panda’s op basis van kolomwaarde

Ik heb het volgende DataFrame:

             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

Ik moet de rijen verwijderen waar line_race gelijk is aan 0. Wat is de meest efficiënte manier om dit te doen?


Antwoord 1, autoriteit 100%

Als ik het goed begrijp, zou het zo simpel moeten zijn als:

df = df[df.line_race != 0]

Antwoord 2, autoriteit 20%

Maar voor toekomstige bypassers zou je kunnen vermelden dat df = df[df.line_race != 0] niets doet wanneer je probeert te filteren op None/missing waarden.

Werkt:

df = df[df.line_race != 0]

Doet niets:

df = df[df.line_race != None]

Werkt:

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

Antwoord 3, autoriteit 7%

om nog een oplossing toe te voegen, vooral handig als je de nieuwe panda-beoordelaars gebruikt, andere oplossingen zullen de originele panda’s vervangen en de beoordelaars verliezen

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

Antwoord 4, autoriteit 4%

De beste manier om dit te doen is met booleaanse maskering:

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

UPDATE: Nu Panda’s 0.13 uit is, is een andere manier om dit te doen df.query('line_race != 0').


Antwoord 5, autoriteit 3%

Als u rijen wilt verwijderen op basis van meerdere waarden van de kolom, kunt u het volgende gebruiken:

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

Om alle rijen met waarden 0 en 10 voor line_race te verwijderen.


Antwoord 6, autoriteit 2%

Hoewel het vorige antwoord bijna hetzelfde is als wat ik ga doen, vereist het gebruik van de indexmethode geen andere indexeringsmethode .loc(). Het kan op een vergelijkbare maar nauwkeurige manier worden gedaan als

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

Antwoord 7

Het gegeven antwoord is niettemin correct, aangezien iemand hierboven zei dat je df.query('line_race != 0') kunt gebruiken, wat afhankelijk van je probleem veel sneller is. Sterk aanbevelen.


Antwoord 8

In geval van meerdere waarden en str dtype

Ik heb het volgende gebruikt om bepaalde waarden in een kolom uit te filteren:

def filter_rows_by_values(df, col, values):
    return df[df[col].isin(values) == False]

Voorbeeld:

In een DataFrame wil ik rijen verwijderen met de waarden “b” en “c” in kolom “str”

df = pd.DataFrame({"str": ["a","a","a","a","b","b","c"], "other": [1,2,3,4,5,6,7]})
df
   str  other
0   a   1
1   a   2
2   a   3
3   a   4
4   b   5
5   b   6
6   c   7
filter_rows_by_values(d,"str", ["b","c"])
   str  other
0   a   1
1   a   2
2   a   3
3   a   4

Antwoord 9

Een andere manier om het te doen. Misschien niet de meest efficiënte manier, omdat de code er iets complexer uitziet dan de code die in andere antwoorden wordt genoemd, maar nog steeds een alternatieve manier om hetzelfde te doen.

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

Antwoord 10

Ik heb mijn code gecompileerd en uitgevoerd. Dit is een nauwkeurige code. Je kunt het zelf proberen.

data = pd.read_excel('file.xlsx')

Als u een speciaal teken of spatie in de kolomnaam heeft, kunt u deze in '' schrijven zoals in de gegeven code:

data = data[data['expire/t'].notnull()]
print (date)

Als er maar één kolomnaam is zonder spatie of speciaal
karakter heb je er direct toegang toe.

data = data[data.expire ! = 0]
print (date)

Antwoord 11

Nog een manier toevoegen om dit te doen.

 df = df.query("line_race!=0")

Antwoord 12

Gewoon een andere manier toevoegen voor DataFrame, uitgebreid over alle kolommen:

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

Voorbeeld:

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

Antwoord 13

Een van de efficiënte en pandaische manieren is het gebruik van de eq()-methode:

df[~df.line_race.eq(0)]

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes