Per tutte le righe con NaN in una Pandas dataframe, spostare da 1

voti
1
from pandas import DataFrame
from numpy.random import randn

df = DataFrame(randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three'])
df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
df2['one']['i'] = 5

Questa è la mia uscita

        one       two     three
a -1.132283 -1.204504 -0.763302
b       NaN       NaN       NaN
c  1.778895 -1.931615 -0.040319
d       NaN       NaN       NaN
e  0.612546 -0.846982  0.524779
f -0.527883  0.342746 -0.010093
g       NaN       NaN       NaN
h -0.636055 -0.909910  0.642658
i  5.000000       NaN       NaN

Quello che sto cercando di capire è per le colonne che hanno un NaN nell'ultima fila (essendo questa riga i, desidero spostare le colonne di 1.)

In questo momento, sto facendo df2['two'].shift(1)e df2['three'].shift(1), ma c'è un modo consigliato di codifica questo che mi manca?

Così ho df2[-1:]come l'ultimo indice ... ma sto un po 'bloccato qui.

È pubblicato 19/11/2013 alle 19:28
dall'utente
In altre lingue...                            


1 risposte

voti
2

Ci potrebbe essere un modo per farlo con meno doppioni, ma il seguente dovrebbe funzionare, in ogni caso. In primo luogo, scoprire quali colonne abbiamo bisogno di spostare, e quindi sostituire le colonne dalle versioni spostate.

to_shift = pd.isnull(df2.iloc[-1])
df2.loc[:,to_shift] = df2.loc[:,to_shift].shift(1)

Prendi l'ultima riga:

>>> df2.iloc[-1]
one       5
two     NaN
three   NaN
Name: i, dtype: float64

Vedere dove c'è dati mancanti:

>>> pd.isnull(df2.iloc[-1])
one      False
two       True
three     True
Name: i, dtype: bool
>>> to_shift = pd.isnull(df2.iloc[-1])

Selezionare quella porzione del telaio:

>>> df2.loc[:, to_shift]
        two     three
a -0.447225  0.240786
b       NaN       NaN
c  1.736224  0.191835
d       NaN       NaN
e -0.310505  2.121659
f  2.542979 -0.772117
g       NaN       NaN
h -0.350395  0.825386
i       NaN       NaN

Spostalo:

>>> df2.loc[:, to_shift].shift(1)
        two     three
a       NaN       NaN
b -0.447225  0.240786
c       NaN       NaN
d  1.736224  0.191835
e       NaN       NaN
f -0.310505  2.121659
g  2.542979 -0.772117
h       NaN       NaN
i -0.350395  0.825386

E riempire il fotogramma con i dati spostato:

>>> df2.loc[:, to_shift] = df2.loc[:, to_shift].shift(1)
>>> df2
        one       two     three
a -0.691010       NaN       NaN
b       NaN -0.447225  0.240786
c  0.570639       NaN       NaN
d       NaN  1.736224  0.191835
e  2.509598       NaN       NaN
f -2.053269 -0.310505  2.121659
g       NaN  2.542979 -0.772117
h  1.812492       NaN       NaN
i  5.000000 -0.350395  0.825386
Risposto il 19/11/2013 a 19:40
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more