panda selezionare intervallo di righe

voti
2

Ho una domanda veloce. Ho creato un dataframe che ha un sacco di caratteristiche. Voglio creare una nuova colonna che seleziona tutte le righe tra due righe specifiche (che stanno per essere ingressi).

Dire che il dataframe è il seguente:

data = {'currency': ['Euro', 'Euro', 'Euro', 'Dollar', 'Dollar', 'Yen', 'Yen', 'Yen', 'Pound', 'Pound', 'Pound, 'Pesos', 'Pesos'], 
    'cost': [34, 67, 32, 29, 48, 123, 23, 45, 78, 86, 23, 45, 67]}
df = pd.DataFrame(data, columns = ['currency', 'cost'])
df

tavolo df

Voglio aggiungere una nuova colonna che assegna un 1 quando viene soddisfatta una condizione. Nel mio caso la condizione è tutte le righe tra due valute specifiche. Ad esempio, dire che io voglio tutte le valute tra 'Dollar' e 'Pound'. La mia ipotesi è che ho per creare una maschera e usarlo come un condizionale, che dirà selezionare tutte le righe tra la prima fila 'Dollar' e l'ultima riga 'Pound' (vale a dire le righe 3-10).

Ho problemi creando quella maschera, però, come le valute vengono selezionati in ordine alfabetico:

mask = (df['currency'] >= 'Dollar') & (df['currency'] <= 'Pound')

Quanto sopra crea una nuova colonna con T in tutte le valute, ad eccezione 'yen'. Posso capire perché quanto sopra non riesce, ma non riesco a pensare ad un modo di fare quello che voglio.

Nota: gli stessi nomi delle valute arriveranno in gruppi, ad esempio 'Pounds' non può essere in righe 4-5 e poi 8-10.

Grazie in anticipo

È pubblicato 17/04/2018 alle 05:16
dall'utente
In altre lingue...                            


2 risposte

voti
3

Soluzione generale di lavoro per l'indice duplicato anche:

a = df['currency'].eq('Dollar').cumsum()
b = df['currency'].eq('Pound').iloc[::-1].cumsum()
df['new'] = a.mul(b).clip_upper(1)

di lavoro alternativi per indice univoco:

a = df['currency'].eq('Dollar').idxmax()
b = df['currency'].eq('Pound').iloc[::-1].idxmax()
df['new'] = 0
df.loc[a:b, 'new'] = 1

print (df)
   currency  cost  new
0      Euro    34    0
1      Euro    67    0
2      Euro    32    0
3    Dollar    29    1
4    Dollar    48    1
5       Yen   123    1
6       Yen    23    1
7       Yen    45    1
8     Pound    78    1
9     Pound    86    1
10    Pound    23    1
11    Pesos    45    0
12    Pesos    67    0

Spiegazione:

  1. Confronto da Series.eqciò che è uguale a ==prima
  2. Ottenere cumsum
  3. Per seconda maschera condizione inversa [::-1]
  4. Multipla insieme da mule sostituire non 0per 1daclip_upper

Nella soluzione secondo idxmaxper il primo valore di indice e impostare 1daloc

Risposto il 17/04/2018 a 05:23
fonte dall'utente

voti
2

Utilizzando l'accumulo di Numpy sulla logica o

cumor = np.logical_or.accumulate

c = df.currency.values
d = c == 'Dollar'
p = c == 'Pound'

df.assign(new=(cumor(d) & cumor(p[::-1])[::-1]).astype(np.uint))

   currency  cost  new
0      Euro    34    0
1      Euro    67    0
2      Euro    32    0
3    Dollar    29    1
4    Dollar    48    1
5       Yen   123    1
6       Yen    23    1
7       Yen    45    1
8     Pound    78    1
9     Pound    86    1
10    Pound    23    1
11    Pesos    45    0
12    Pesos    67    0
Risposto il 17/04/2018 a 05:34
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more