Vairāk
Python Pandas: Iegūt to rindu indeksu, kuru sleja atbilst noteiktai vērtībai
Ja ir dots DataFrame ar kolonnu "BoolCol", mēs vēlamies atrast DataFrame indeksus, kuros "BoolCol" == True.
Pašlaik man ir iterācijas veids, kā to izdarīt, kas darbojas perfekti:
for i in range(100,3000):
if df.iloc[i]['BoolCol']== True:
print i,df.iloc[i]['BoolCol']
Bet tas nav pareizais panda veids, kā to darīt. Pēc izpētes es pašlaik izmantoju šo kodu:
df[df['BoolCol'] == True].index.tolist()
Tas dod man indeksu sarakstu, bet tie nesakrīt, kad es tos pārbaudu, veicot:
df.iloc[i]['BoolCol']
Rezultāts faktiski ir False!!
Kurš būtu pareizākais Pandas veids, kā to izdarīt?
220
3
df.iloc[i]
atgrieždf
rindiņu.i
neatsaucas uz indeksa etiķeti,i
ir indekss, kura pamatā ir 0.Turpretī atribūts
index
atgriež faktiskās indeksu etiķetes, nevis skaitliskos rindu indeksus:vai līdzvērtīgi,
Jūs varat redzēt atšķirību diezgan skaidri, spēlējoties ar DataFrame ar indeksu, kas nav noklusējuma indekss, kurš nav vienāds ar rindas skaitlisko pozīciju:
Ja vēlaties izmantot indeksu,
tad rindas var atlasīt, izmantojot
loc
, nevisiloc
:Ņemiet vērā, ka
loc
var pieņemt arī boolean masīvus:Ja jums ir boolean masīvs
mask
un ir nepieciešamas kārtas indeksu vērtības, tās var aprēķināt, izmantojotnp.flatnonzero
:Izmantojiet
df.iloc
, lai atlasītu rindas pēc kārtas indeksa:To var izdarīt, izmantojot funkciju numpy where():
Lai gan jums ne vienmēr ir nepieciešams indekss, lai atrastu atbilstību, bet gadījumā, ja nepieciešams:
Vispirms varat pārbaudīt
query
, ja mērķa kolonnas tips irbool
(PS: par to, kā to izmantot, lūdzu, skatiet saite ).Pēc tam, kad mēs filtrējam sākotnējo df pēc "Boolean" slejas, mēs varam izvēlēties indeksu .
Arī pandas ir
nonzero
, mēs vienkārši izvēlamiesTrue
rindas pozīciju un, izmantojot to, sagriežamDataFrame
vaiindex
.