Având o DataFrame cu o coloană "BoolCol", ne-o dorim pentru a găsi indicii DataFrame în care valorile pentru "BoolCol" == True
Am în prezent au iterarea mod de a face asta, care functioneaza perfect:
for i in range(100,3000):
if df.iloc[i]['BoolCol']== True:
print i,df.iloc[i]['BoolCol']
Dar acest lucru nu este corect panda's cale de a o face. După unele cercetări, eu sunt în prezent, folosind acest cod:
df[df['BoolCol'] == True].index.tolist()
Asta îmi dă o listă de indicii, dar ele nu se potrivesc, atunci când am verifica-le de a face:
df.iloc[i]['BoolCol']
Rezultatul este, de fapt, False!!
Care ar fi cea corectă Panda mod de a face acest lucru?
df.iloc[i]
revine ith
rând de "df". " eu "nu se referă la indicele de etichetă," eu " este un index 0-based.
În contrast, atributul "index" se întoarce real index etichete, nu numerice rând-indici:
df.index[df['BoolCol'] == True].tolist()
sau echivalent,
df.index[df['BoolCol']].tolist()
Puteți vedea diferența destul de clar de joc cu un DataFrame cu un non-index implicit, care nu are egal la rând's numerice de poziție:
df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
index=[10,20,30,40,50])
In [53]: df
Out[53]:
BoolCol
10 True
20 False
30 False
40 True
50 True
[5 rows x 1 columns]
In [54]: df.index[df['BoolCol']].tolist()
Out[54]: [10, 40, 50]
Dacă doriți să utilizați index,
In [56]: idx = df.index[df['BoolCol']]
In [57]: idx
Out[57]: Int64Index([10, 40, 50], dtype='int64')
apoi, puteți selecta rânduri, folosind loc "în loc de" iloc
:
In [58]: df.loc[idx]
Out[58]:
BoolCol
10 True
40 True
50 True
[3 rows x 1 columns]
Rețineți că loc
poate accepta, de asemenea, boolean tablouri:
In [55]: df.loc[df['BoolCol']]
Out[55]:
BoolCol
10 True
40 True
50 True
[3 rows x 1 columns]
Dacă aveți o matrice boolean, "masca", și au nevoie de ordine, valorile indicelui, se poate calcula-le folosind np.flatnonzero
:
In [110]: np.flatnonzero(df['BoolCol'])
Out[112]: array([0, 3, 4])
Utilizarea df.iloc
pentru a selecta rânduri de ordine index:
In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
Out[113]:
BoolCol
10 True
40 True
50 True
Poate fi realizat folosind numpy în cazul în care funcția ():
import pandas as pd
import numpy as np
In [716]: df = pd.DataFrame({"gene_name": ['SLC45A1', 'NECAP2', 'CLIC4', 'ADC', 'AGBL4'] , "BoolCol": [False, True, False, True, True] },
index=list("abcde"))
In [717]: df
Out[717]:
BoolCol gene_name
a False SLC45A1
b True NECAP2
c False CLIC4
d True ADC
e True AGBL4
In [718]: np.where(df["BoolCol"] == True)
Out[718]: (array([1, 3, 4]),)
In [719]: select_indices = list(np.where(df["BoolCol"] == True)[0])
In [720]: df.iloc[select_indices]
Out[720]:
BoolCol gene_name
b True NECAP2
d True ADC
e True AGBL4
Deși nu't întotdeauna nevoie de index pentru un meci, dar incase dacă ai nevoie de:
In [796]: df.iloc[select_indices].index
Out[796]: Index([u'b', u'd', u'e'], dtype='object')
In [797]: df.iloc[select_indices].index.tolist()
Out[797]: ['b', 'd', 'e']
Mai întâi puteți verifica "query" când ținta coloană este de tip bool` (PS: despre cum să-l folosească, vă rugăm să verificați link )
df.query('BoolCol')
Out[123]:
BoolCol
10 True
40 True
50 True
După ce ne-am filtrul original df de Boolean coloana putem alege index .
df=df.query('BoolCol')
df.index
Out[125]: Int64Index([10, 40, 50], dtype='int64')
De asemenea, panda au nenul
, vom selecta doar pe poziția de "Adevărat" rând și folosind-o felie DataFrame " sau " index
df.index[df.BoolCol.nonzero()[0]]
Out[128]: Int64Index([10, 40, 50], dtype='int64')
Am extins această întrebare, care este modul de a ajunge la "rând", "coloana" și "valoarea" toate meciurile valoare?
aici este soluția:
`` import panda ca pd import numpy ca np
def search_coordinate(df_data: pd.DataFrame, search_set: set) -> lista: nda_values = df_data.valorile tuple_index = np.în cazul în care(np.isin(nda_values, [e pentru e în search_set])) reveni [(row, col, nda_values[row][col]) pentru row, col în zip(tuple_index[0], tuple_index[1])]
dacă nume == 'principalele': test_datas = [['cat', 'câine', ''], ['carasi', '', 'pisoi'], ['Puppy', 'hamster', 'mouse-ul'] ] df_data = pd.DataFrame(test_datas) print(df_data) result_list = search_coordinate(df_data, {'dog', 'Puppy'}) print(f"\n\n{'rând':<4} {'col':<4} {'numele':>10}") [print(f"{rând:<4} {col:<4} {nume:>10}") pentru row, col, numele în result_list] ``
Ieșire:
`` 0 1 2 0 câine pisică 1 carasi pisoi 2 Catelus hamster mouse-ul
rând col numele 0 1 câine 2 0 Catelus ``