2017-06-24 3 views
1

je le dataframe suivant s:Remplacement les données d'un élément de trame de données avec la ligne suivante

0 Symbol DataDiscriminator Open 
1 AKAM  Summary    - 
2 AKAM  Lot     2017-05-12, 16:20:00 
3 APA  Summary    - 
4 APA  Lot     2017-03-31, 16:20:00 
5 APA  Lot     2017-03-24, 16:20:00 

je voudrais définir la valeur de Ouvrir élément de DataDiscriminator = « Résumé » avec le date de la ligne suivante puis retirez les DataDiscriminator = lignes "Lot" pour obtenir:

0 Symbol DataDiscriminator Open 
1 AKAM  Summary    2017-05-12 
3 APA  Summary    2017-03-31 
... 

La logique de travail actuelle est:

for i, row in s.iterrows(): 
    if s.DataDiscriminator[i] == "Summary": 
     o = s.Open[i+1]       # Get the next row's Open data 
     s = s.set_value(i, "Open", o[0:10])  # Slice out the time in the new Open data 
s = s[s.DataDiscriminator == "Summary"]   # Keep only the Summary rows in the dataset 

Existe-t-il une meilleure façon vectorisée d'y parvenir?

Répondre

4

Shift est le moyen standard vectorisée de le faire:

>>> df.loc[ df.DataDiscriminator=='Summary','Open'] = df.Open.shift(-1) 
>>> df = df[ df.DataDiscriminator=='Summary' ] 

    Symbol DataDiscriminator     Open 
0 AKAM   Summary 2017-05-12, 16:20:00 
2 APA   Summary 2017-03-31, 16:20:00 
+0

Merci @JohnE. Comment puis-je découper le composant time du champ * Open *? 's.loc [s.DataDiscriminator == 'Summary', 'Open'] = s.Open.shift (-1) [0:10]' donne NaN après quelques lignes dans * Open *. – reservoirinvest

+0

Si c'est une chaîne, essayez 'df.Open.str.slice (12)'. D'une manière générale, pour les chaînes, vérifiez les docs pour les accesseurs de chaînes ('str'). Ou si vous avez la colonne stockée en tant que datetime pandas/python, vous pouvez utiliser un accesseur datetime ('dt') – JohnE

2

Remplacer - avec None, remblayer avec bfill et query

df.replace(dict(Open={'-': None})).bfill().query('DataDiscriminator != "Lot"') 

    0 Symbol DataDiscriminator     Open 
0 1 AKAM   Summary 2017-05-12, 16:20:00 
2 3 APA   Summary 2017-03-31, 16:20:00 
+0

Ah, oui, il est plus logique de laisser bfill faire le travail combiné de' loc' & 'shift 'dans ce cas. Mais je vais laisser ma réponse comme l'approche la plus évidente. ;-) – JohnE

+0

Merci @piRSquared. Malheureusement, cette solution donne ** ImportError **: * 'numexpr' n'est pas installé ou une version non supportée. Impossible d'utiliser engine = 'numexpr' pour query/eval si 'numexpr' n'est pas installé. * Ai-je oublié quelque chose? – reservoirinvest

+0

Oui. Vous manquez numexpr. (-: c'est ce qui est nécessaire pour la requête.) Vous pouvez toujours faire le remplacement et bfill.Utilisez simplement une tranche booléenne par la suite similaire à ce que JohnE a fait – piRSquared