Python, Pandas ffill() не работает со столбцами объектов

avatar
Eric Kim
7 апреля 2018 в 23:34
3538
1
0

Вот пример кадра данных:

data = np.matrix([[4,3,6,4,1,7,5,5], [1,2,3,6,4,2,4,9], ['a',np.nan, np.nan, 'b', np.nan, 'c', np.nan, 'd'],[1,np.nan, np.nan, 2, np.nan, 2, np.nan, 2]]).T
data = pd.DataFrame(data)

>>> data

   0  1    2    3
0  4  1    a    1
1  3  2  nan  nan
2  6  3  nan  nan
3  4  6    b    2
4  1  4  nan  nan
5  7  2    c    2
6  5  4  nan  nan
7  5  9    d    2

>>> data.dtypes

0    object
1    object
2    object
3    object
dtype: object

Как видите, dtypes для некоторых столбцов имеют вид object. Они не float или int.

Если я введу data.ffill() в консоль, ничего не произойдет. Но если я попробую data[3] = data[3].astype(float).ffill()

заменяет data на:

   0  1    2    3
0  4  1    a  1.0
1  3  2  nan  1.0
2  6  3  nan  1.0
3  4  6    b  2.0
4  1  4  nan  2.0
5  7  2    c  2.0
6  5  4  nan  2.0
7  5  9    d  2.0

По-видимому, pd.ffill() работает только с числовыми столбцами, но не со строковыми столбцами. data[2] = data[2].astype(str).ffill() ничего не изменил. Как я могу переслать строки с dtype=object?

Вот что мне нужно:

   0  1    2    3
0  4  1    a  1.0
1  3  2    a  1.0
2  6  3    a  1.0
3  4  6    b  2.0
4  1  4    b  2.0
5  7  2    c  2.0
  • Я извлек данные из csv с помощью pd.read_csv(). В исходном CSV-файле некоторые столбцы содержат числовые значения, а некоторые — строковые столбцы
  • .
Источник
ALollz
7 апреля 2018 в 23:43
0

Объект nan — это буквально строка 'nan', которая не будет распознана пандами как нулевое значение. Когда вы впервые выполняете astype(float), все значения становятся истинными np.NaN нулевыми значениями, поэтому ffill распознает их соответствующим образом, поскольку строка 'nan' не имеет числового эквивалента, а строка '1' может быть однозначно преобразована в число .

Eric Kim
7 апреля 2018 в 23:54
0

@ALollz Любое изящное решение для замены строки «nan» предыдущими значениями, кроме извлечения с использованием не-str dtype в первую очередь?

Ответы (1)

avatar
ALollz
8 апреля 2018 в 00:08
1

Если все строки просто хранятся как 'nan', вы можете заполнить весь DataFrame одной строкой. None — это распознаваемое нулевое значение, которое работает для типа объекта.

data.mask(data=='nan', None).ffill()

#0    4    1    a    1
#1    3    2    a    1
#2    6    3    a    1
#3    4    6    b    2
#4    1    4    b    2
#5    7    2    c    2
#6    5    4    c    2
#7    5    9    d    2