3 votes

Comment grouper et rééchantillonner des données dans pandas ?

J'ai des données de vente pour différents clients à des dates différentes. Mais les dates ne sont pas continues et je voudrais rééchantillonner les données à une fréquence quotidienne. Comment puis-je faire cela ?

MWE

import numpy as np
import pandas as pd

df = pd.DataFrame({'id': list('aababcbc'),
                  'date': pd.date_range('2022-01-01',periods=8),
                  'value':range(8)}).sort_values('id')

df

id  date    value
0   a   2022-01-01  0
1   a   2022-01-02  1
3   a   2022-01-04  3
2   b   2022-01-03  2
4   b   2022-01-05  4
6   b   2022-01-07  6
5   c   2022-01-06  5
7   c   2022-01-08  7

La sortie requise est la suivante

id  date    value  
a   2022-01-01  0  
a   2022-01-02  1  
a   2022-01-03  0 ** there is no data for a in this day  
a   2022-01-04  3

b   2022-01-03  2    
b   2022-01-04  0 ** there is no data for b in this day  
b   2022-01-05  4  
b   2022-01-06  0 ** there is no data for b in this day  
b   2022-01-07  6

c   2022-01-06  5  
c   2022-01-07  0 ** there is no data for c in this day
c   2022-01-08  7

Ma tentative

df.groupby(['id']).resample('D',on='date')['value'].sum().reset_index()

4voto

Nameless Points 15
df["date"] = pd.to_datetime(df["date"])
df.set_index("date").groupby("id").resample("1d").sum()

2voto

Vladimir Fokow Points 115
def f(df):
    return df.resample('D', on='date')['value'].sum()

df.groupby(['id']).apply(f).reset_index()

produit :

   id       date  value
0   a 2022-01-01      0
1   a 2022-01-02      1
2   a 2022-01-03      0
3   a 2022-01-04      3
4   b 2022-01-03      2
5   b 2022-01-04      0
6   b 2022-01-05      4
7   b 2022-01-06      0
8   b 2022-01-07      6
9   c 2022-01-06      5
10  c 2022-01-07      0
11  c 2022-01-08      7

1voto

dallascow Points 63

Voici la solution que j'ai trouvée :

df.groupby(['id']).apply(lambda x: x.resample('D',on='date')['value'].sum()).reset_index()

id  date    value
0   a   2022-01-01  0
1   a   2022-01-02  1
2   a   2022-01-03  0
3   a   2022-01-04  3
4   b   2022-01-03  2
5   b   2022-01-04  0
6   b   2022-01-05  4
7   b   2022-01-06  0
8   b   2022-01-07  6
9   c   2022-01-06  5
10  c   2022-01-07  0
11  c   2022-01-08  7

1voto

Cela pourrait vous aider à résoudre le puzzle.

idx = pd.date_range('2022-01-01', '2022-1-31').to_frame()
df2 = pd.merge(df, idx, how='outer' , left_on='date', right_on=0)

df2

En gros, cela fusionne les deux cadres de manière "externe", c'est-à-dire que cela renvoie toutes les rangées possibles.

idx est un DF avec toutes les dates sur lesquelles vous concentrez votre analyse, et les NaN seront VOS valeurs nulles --> ** il n'y a pas de données pour a en ce jour

Ensuite, vous pouvez décider de convertir, de compter ou d'extrapoler les données. NaN rangs en fonction de vos besoins.

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X