2013-05-02 7 views
12

mam do czynienia z pandy DataFrames tak:uzupełnienie brakujących danych pandy z poprzedniej wartości nie brakuje, pogrupowane według klucza

id x 
0 1 10 
1 1 20 
2 2 100 
3 2 200 
4 1 NaN 
5 2 NaN 
6 1 300 
7 1 NaN 

chciałbym zastąpić każdego nan „x” z poprzedniego non-NaN „x” z rzędu o tej samej wartości „id”:

id x 
0 1 10 
1 1 20 
2 2 100 
3 2 200 
4 1 20 
5 2 200 
6 1 300 
7 1 300 

jest jakiś zręczny sposób to zrobić bez konieczności ręcznego zapętlenie nad wiersze?

Odpowiedz

16

Można przeprowadzić operację groupby/forward-fill na każdą z grup:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'id': [1,1,2,2,1,2,1,1], 'x':[10,20,100,200,np.nan,np.nan,300,np.nan]}) 
df['x'] = df.groupby(['id'])['x'].ffill() 
print(df) 

daje

id  x 
0 1 10.0 
1 1 20.0 
2 2 100.0 
3 2 200.0 
4 1 20.0 
5 2 200.0 
6 1 300.0 
7 1 300.0 
+0

Opcja 'ffill' jest to, czego potrzebuję. Dzięki! – ChrisB

+1

Możesz także zrobić 'df ['x'] = df.groupby ('id'). Fillna (method = 'ffill')' dla osiągnięcia tego samego dla nieco prostszej składni. – Zhang18

+0

@ Zhang18: Dzięki za poprawę. 'df.groupby (['id']) .ffill()' również by działało. – unutbu