2017-10-17 4 views
0

J'ai une trame de données comme ceci:comment ce qui concerne Smart indexation à des dates dans les données avec des dates manquantes dans Pandas

id  date  value 
1  2017-01-01 10 
1  2017-01-01 20 
1  2017-01-02 10 
1  2017-01-02 15 
1  2017-01-07 25 
2  2017-05-01 10 
2  2017-05-01 15 
2  2017-05-20 30 
3  2010-08-08 40 
3  2010-08-11 20 
3  2010-08-11 43 

Je veux ajouter des valeurs pour chaque date et d'ajouter et d'une matière de colonne d'index les dates par exemple, enfin les données devraient ressembler à ceci:

id  date  value index 
1  2017-01-01 30  1 
1  2017-01-02 25  2 
1  2017-01-07 25  3 
2  2017-05-01 25  1 
2  2017-05-20 30  2 
3  2010-08-08 40  1 
3  2010-08-11 63  2 
+0

'ajouter et une colonne de ce qui concerne l'indice du dates' S'il vous plaît expliquer cela plus en détail. –

Répondre

1

sum et cumcount

df1=df.groupby(['id','date'],as_index=False).value.sum() 
df1['index']=df1.groupby('id',as_index=False).cumcount().add(1) 
df1 
Out[167]: 
    id  date value index 
0 1 2017-01-01  30  1 
1 1 2017-01-02  25  2 
2 1 2017-01-07  25  3 
3 2 2017-05-01  25  1 
4 2 2017-05-20  30  2 
5 3 2010-08-08  40  1 
6 3 2010-08-11  63  2 
2

Pandas .groupby() est votre ami.

>>> df 
    id  date value 
0 1 2017-01-01  10 
1 1 2017-01-01  20 
2 1 2017-01-02  10 
3 1 2017-01-02  15 
4 1 2017-01-07  25 
5 2 2017-05-01  10 
6 2 2017-05-01  15 
7 2 2017-05-20  30 
8 3 2010-08-08  40 
9 3 2010-08-11  20 
10 3 2010-08-11  43 
groupe

les données de la date et l'identifiant de sorte qu'il ne sera pas sommé avec .sum(). as_index=False fait en sorte que la colonne date ne devienne pas l'index. sort=False fait en sorte qu'il ne soit pas trié par dates.

>>> g = df.groupby(['date', 'id'], as_index=False, sort=False).sum() 
>>> g 
     date id value 
2 2017-01-01 1  30 
3 2017-01-02 1  25 
4 2017-01-07 1  25 
5 2017-05-01 2  25 
6 2017-05-20 2  30 
0 2010-08-08 3  40 
1 2010-08-11 3  63 

Il est un peu ambigu ce que vous entendez par la deuxième partie, mais en supposant que cela signifie que la somme cumulée de l'égalité ids:

>>> g['index'] = g.assign(count=1).groupby('id').cumsum()['count'] 
>>> g 
     date id value index 
2 2017-01-01 1  30  1 
3 2017-01-02 1  25  2 
4 2017-01-07 1  25  3 
5 2017-05-01 2  25  1 
6 2017-05-20 2  30  2 
0 2010-08-08 3  40  1 
1 2010-08-11 3  63  2 

ici nous attribuons g['index'] à la somme cumulative de la colonne count nous donnez à la trame de données une valeur égale à un pour chaque élément. Si ce que vous vouliez réellement dire était la somme cumulée de chaque mois similaire, cela peut être fait en groupant par df.date.dt.month et en appliquant une méthode similaire.

+0

merci! c'est ce que je voulais – ary