1
votes

Filtrez sur deux colonnes sur le dataframe pandas, où l'une représente l'heure des appels téléphoniques

J'ai un dataframe pandas comme ci-dessous:

df2 = df.loc[(pd.to_timedelta(df.HOUR).between('06:00:00','19:00:00') | df['DAY_OF_WEEK'] == 'Sunday')]
calls_night_or_sunday = df[~df2].copy()

Je dois appliquer un filtre pour qu'un nouveau dataframe ne s'inscrive que là où HOUR entre 19:00:00 et 07:00:00 ou DAY_OF_WEEK == 'Sunday'. Un résultat attendu:

DAY_OF_WEEK |   HOUR  | ID
Monday      |21:02:02 | 1
Saturday    |23:02:02 | 2
Monday      |09:22:02 | 3

J'essaye ce qui suit:

import pandas as pd

df = pd.DataFrame({'DAY_OF_WEEK': ['Monday', 'Sunday', 'Saturday', 'Monday', 'Tuesday'],
                   'HOUR': ['21:02:02', '11:22:02', '23:02:02', '09:22:02', '09:02:02'],
              'id': [1,2,2,3,1]})

df

mais, j'ai une sortie où toutes les lignes ont reçu NaN . Quelqu'un peut-il aider?


0 commentaires

4 Réponses :


-1
votes

Essayez d'utiliser "|" au lieu de "ou"


1 commentaires

Essayez d'utiliser .query () --- df2 = df.query ('(HOUR> = "06:00:00" et HOUR <= "19:00:00") ou Day_of_week == "Sunday")



-1
votes

Essayez plutôt ceci

df2 = df.loc[(pd.to_timedelta(df.HOUR).between('06:00:00','19:00:00') | (df['DAY_OF_WEEK'] == 'Sunday'))]


2 commentaires

entre 19h00 et 7h00


De cette façon, toutes les données reçoivent NaN



2
votes
import pandas as pd

df = pd.DataFrame({'DAY_OF_WEEK': ['Monday', 'Sunday', 'Saturday', 'Monday', 'Tuesday'],
                   'HOUR': ['21:02:02', '11:22:02', '23:02:02', '09:22:02', '09:02:02'],
              'id': [1,2,2,3,1]})

df2 = df[(df.HOUR.between('19:00:00','23:59:59')) | (df.HOUR.between('00:00:00','06:00:00')) | (df.DAY_OF_WEEK == 'Sunday')]
df2

# Output
# DAY_OF_WEEK   HOUR    id
# 0 Monday  21:02:02    1
# 1 Sunday  11:22:02    2
# 2 Saturday    23:02:02    2
Pandas conditionsUPDATED:
timeranges changed

2 commentaires

les lignes 3 et 4 mettent les valeurs de temps hors de la plage


Je ne comprends pas ce que tu veux faire. Vous avez écrit "où HOUR entre 19:00:00 et 07:00:00 ou DAY_OF_WEEK == 'dimanche'" et par exemple écrit "Lundi | 09: 22: 02 | 3". 09:22:02 pas entre 19:00:00 et 07:00:00.



1
votes

Vous pouvez utiliser:

  DAY_OF_WEEK      HOUR  id
0      Monday  21:02:02   1
1      Sunday  11:22:02   2
2    Saturday  23:02:02   2

Production:

df.loc[('19' < df['HOUR']) | (df['HOUR'] < '06') |  (df['DAY_OF_WEEK'] == 'Sunday')]


0 commentaires