2016-08-03 7 views
2

Wie kann ich in Pandas mit einer Teilmenge von Zeilen in einer Spalte arbeiten, die nach Index ausgewählt wurde?Wie man eine Zahl zu einem Indexbereich eines Pandas-Arrays hinzufügt

Insbesondere, wie kann ich 1.0 zu Spalte y hier hinzufügen, nur wo das Datum größer als 2016-08-04 ist?

>>> pandas.DataFrame(
... index=[datetime.date.today(), datetime.date.today() + datetime.timedelta(1)], 
... data=[[1.2, 234], [3.3, 432]], 
... columns=['x', 'y']) 
       x y 
2016-08-04 1.2 234 
2016-08-05 3.3 432 

[2 rows x 2 columns] 

Es macht mir nichts aus, ob dies in-Place ist oder einen neuen Datenrahmen zurückgibt.

Die Antwort sollte in diesem Fall sein:

   x y 
2016-08-04 1.2 234 
2016-08-05 3.3 433 

Antwort

3

Wenn Sie den Index auf ein DateTimeIndex konvertieren wird es einfacher:

df.index = pd.to_datetime(df.index) 
df.loc[df.index > '2016-08-04', 'y'] += 1 
df 
Out: 
       x y 
2016-08-04 1.2 234 
2016-08-05 3.3 433 
+1

Pandas erlaubt Datumsvergleiche mit Strings, so dass Sie einfach 'df.index> '2016-08-04'' machen können. – root

+0

@root viel besser. Vielen Dank. – ayhan

+0

In meinem vollständigen Code habe ich bereits einen DateTimeIndex (ich habe das Schreiben der Frage vergessen), benutze pandas.read_table mit dem 'date_parser' Argument. Es war nur die '.loc' Verwendung, die ich irgendwie nicht richtig verstanden hatte. –

0

Sie die .where Methode auf der Säule y verwenden können.

df.y = df.y.where(df.index < datetime.date(2016, 8, 4), lambda k: k + 1) 
1

Als Nicht-Inplace Alternativ können Sie df.add verwenden:

df.add(df.index > pd.to_datetime('2016-08-04'), axis=0, level="y") 
1

Kasse the docs für DatetimeIndex oder the docs für die Komfortfunktion date_range. Entweder können Sie einen DatetimeIndex festlegen, mit dem Sie arbeiten können.

df = pandas.DataFrame(
    [[1.2, 234], [3.3, 432]], 
    index=pd.DatetimeIndex(start='today', periods=2, freq='D', normalize=True), 
    columns=['x', 'y']) 

df.loc[df.index > '2016-08-04', 'y'] += 1