2017-07-28 3 views
1

Ich habe folgendes Problem:Python (Pandas): ersetzen Wert, wenn die vorherige Wert gleich wie nächster Wert ist

Ich habe einen Datenrahmen bekomme, das bis zu etwa 6 Millionen Zeilen sein könnte. Eine der Spalten in diesem Datenrahmen enthält bestimmte IDs.

ID 
NaN 
NaN 
D1 
D1 
D1 
NaN 
D1 
D1 
NaN 
NaN 
NaN 
NaN 
D2 
NaN 
D2 
NaN 
NaN 
NaN 
NaN 
D3 
NaN 
D3 
NaN 
D3 
NaN 
NaN 

Ich möchte die NaNs machen, die zwischen den IDs die gleichen wie die IDs enthalten ist. Also sollte oben df:

ID 
NaN 
NaN 
D1 
D1 
D1 
D1 
D1 
D1 
NaN 
NaN 
NaN 
NaN 
D2 
D2 
D2 
NaN 
NaN 
NaN 
NaN 
D3 
D3 
D3 
D3 
D3 
NaN 
NaN 

Weiß jemand, wie man das in einer schnellen, speicherökonomischen Weise macht? Vielen Dank im Voraus.

Antwort

1

Mit shift und loc. Vergleichen vorherige und nächste Werte mit shift(1) und shift(-1)

In [219]: df.loc[df.ID.shift(-1) == df.ID.shift(1), 'ID'] = df.ID.shift(1) 

In [220]: df 
Out[220]: 
    ID 
0 NaN 
1 NaN 
2 D1 
3 D1 
4 D1 
5 D1 
6 D1 
7 D1 
8 NaN 
9 NaN 
10 NaN 
11 NaN 
12 D2 
13 D2 
14 D2 
15 NaN 
16 NaN 
17 NaN 
18 NaN 
19 D3 
20 D3 
21 D3 
22 D3 
23 D3 
24 NaN 
25 NaN 
1

Sie ffill verwenden können und bfill - es funktioniert auch, wenn Lücke höher als 1:

f = df['ID'].ffill() 
df['a'] = df['ID'].mask(f.eq(df['ID'].bfill()), f) 
print (df) 

    ID a 
0 NaN NaN 
1 NaN NaN 
2 D1 D1 
3 D1 D1 
4 D1 D1 
5 NaN D1 
6 D1 D1 
7 D1 D1 
8 NaN NaN 
9 NaN NaN 
10 NaN NaN 
11 NaN NaN 
12 D2 D2 
13 NaN D2 
14 D2 D2 
15 NaN NaN 
16 NaN NaN 
17 NaN NaN 
18 NaN NaN 
19 D3 D3 
20 NaN D3 
21 D3 D3 
22 NaN D3 
23 D3 D3 
24 NaN NaN 
25 NaN NaN 
Verwandte Themen