2015-07-30 8 views
5

Ciao ragazzi, supponiamo di avere dati di tempi. Come filtrare i dati che si verificano solo in 1 giorni diversi?Come filtrare shift +/- 1 giorno in Panda?

Supponiamo dati è

date   name 
2015-04-03 A 
2015-04-04 A 
2015-04-05 A 
2015-04-03 B 

Quello che voglio fare è qualcosa di simile

df[df.shift(1).contains(df.name) or df.shift(-1).contains(df.name)] 

che mi avrebbe dato

date   name 
2015-04-03 A 
2015-04-04 A 
2015-04-05 A 

Come fare questo in panda?

+2

Sei alla ricerca di corrispondenze esatte o se 'nome' fa davvero 'contenere' la riga corrente 'nome' valore – EdChum

+0

non lo faccio capisci la domanda, ma sembra che tu voglia usare 'groupby ('name')' qui e poi qualsiasi altra cosa tu stia cercando di fare. Forse questo? 'df.groupby ('name') ['date']. apply (lambda x: x == x.shift() + datetime.timedelta (1))' – JohnE

+1

Questa è una domanda molto confusa, perché ha 5 upvotes?!? La descrizione, il codice e i risultati sono tutti diversi l'uno dall'altro. Questo dovrebbe essere chiarito dal PO se c'è molto interesse nella domanda e nelle risposte. – JohnE

risposta

0

Si desidera avvolgere le condizioni tra parentesi e utilizzare il bit | invece di or:

In [83]: 
df[(df['name'].shift(1) == df['name']) | (df['name'].shift(-1) == df['name']) ] 

Out[83]: 
     date name 
0 2015-04-03 A 
1 2015-04-04 A 
2 2015-04-05 A 
1

userei value_counts per la data:

vc = df.date.value_counts() 

Poi vorrei, se l'insieme di dati è piccolo, vorrei utilizzare .isin:

df[df.date.isin(vc[vc == 1].index.tolist())] 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 

Se l'insieme di dati è più grande, vorrei utilizzare il operazione di unione:

df_singles = df.merge(left_on='date',right=pd.DataFrame(vc[vc == 1]), right_index=True) 
del df_singles[0] 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 
0

Convert data colonna per oggetto datetime. Quindi puoi calcolare la differenza tra i giorni. Dopo di che, è possibile filtrare per il numero di giorni differenza si desidera conservare

data['date'] = pd.to_datetime(data['date']) 
data['Diff'] = data['date'].diff() 
print data 

     date name Diff 
0 2015-04-03 A  NaT 
1 2015-04-04 A 1 days 
2 2015-04-05 A 1 days 
3 2015-04-03 B -2 days 

data_filtered = data[data['Diff'] == '1 days'] 
del data_filtered['Diff'] 
print data_filtered 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 
Problemi correlati