удалить начальные NaN из фрейма данных, оставив другие на месте - PullRequest
0 голосов
/ 03 мая 2018

Пожалуйста, помогите! Я провел некоторое исследование, и эти вопросы связаны, однако я не могу помассировать это, чтобы работать: Несколько смен на фрейме данных Сдвиг всего столбца на фрейме данных панд Удаление NaN из DataFrame и дубликатов из мультииндекса

Это самая близкая к моей проблеме: Сдвиг строки влево

Моя проблема: Проблема с временными рядами, поэтому я хочу сместить строки влево, если первой записью является NaN, сохраняя при этом любые другие NaN в этой строке после исходного первого значения там, где они есть.

Итак, запуск DataFrame выглядит так:

  A     B     C     D
1 10    11    23    90
2 NaN   05    NaN   56
3 11    3     Nan   11
4 NaN   NaN   56    NaN`   

У меня неправильное решение, оно выглядит следующим образом:

df3 = df2.apply(lambda x: pd.Series(x.dropna().values),1)
df3.columns=df2.columns[:len(df3.columns)]
df3= df3.reindex_axis(df2.columns,1)

Это дает (не то, что я хочу!) :

  A     B     C     D
1 10    11    23    90
2 05    56    NaN   NaN
3 11    3     11    NaN
4 56    NaN   NaN   NaN  

Мне бы хотелось, чтобы датафрейм был таким:

  A     B     C     D
1 10    11    23    90
2 05    NaN   56    NaN
3 11    3     NaN   11
4 56    NaN   NaN   NaN

Таким образом, передний фронт NaNs удаляется, но как только это первое измерение выполнено, любые последующие NaNs остаются на своем месте.

Большое спасибо за любые советы.

1 Ответ

0 голосов
/ 04 мая 2018

Может быть, что-то вроде

In [57]: df.apply(lambda x: x.shift(-x.notnull().values.argmax()), axis=1)
Out[57]: 
      A     B     C     D
1  10.0  11.0  23.0  90.0
2   5.0   NaN  56.0   NaN
3  11.0   3.0   NaN  11.0
4  56.0   NaN   NaN   NaN

Это работает, сдвигая столько ячеек, сколько необходимо, чтобы перенести первое ненулевое значение влево:

In [63]: x = df.iloc[1]

In [64]: x
Out[64]: 
A     NaN
B     5.0
C     NaN
D    56.0
Name: 2, dtype: float64

In [65]: x.notnull()
Out[65]: 
A    False
B     True
C    False
D     True
Name: 2, dtype: bool

In [66]: x.notnull().values
Out[66]: array([False,  True, False,  True])

In [67]: x.notnull().values.argmax()
Out[67]: 1

In [68]: x.shift(-x.notnull().values.argmax())
Out[68]: 
A     5.0
B     NaN
C    56.0
D     NaN
Name: 2, dtype: float64
...