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)]