ошибка с использованием астипа, когда NaN существует в кадре данных

df
     A     B  
0   a=10   b=20.10
1   a=20   NaN
2   NaN    b=30.10
3   a=40   b=40.10

Я пытался:

df['A'] = df['A'].str.extract('(\d+)').astype(int)
df['B'] = df['B'].str.extract('(\d+)').astype(float)

Но я получаю следующую ошибку:

ValueError: невозможно преобразовать float NaN в integer

А также:

AttributeError: может использовать только.str accessor со строковыми значениями, которые используют np.object_ dtype в pandas

Как это исправить?

Ответы

Ответ 1

Если некоторые значения в столбце отсутствуют (NaN), а затем преобразуются в числовые, всегда dtype является float. Вы не можете преобразовать значения в int. Только float, потому что type NaN float.

print (type(np.nan))
<class 'float'>

См. Документы, как конвертировать значения, если хотя бы один NaN:

integer> cast to float64

Если вам нужны значения int, вам нужно заменить NaN на некоторый int, например 0 fillna а затем он отлично работает:

df['A'] = df['A'].str.extract('(\d+)', expand=False)
df['B'] = df['B'].str.extract('(\d+)', expand=False)
print (df)
     A    B
0   10   20
1   20  NaN
2  NaN   30
3   40   40

df1 = df.fillna(0).astype(int)
print (df1)
    A   B
0  10  20
1  20   0
2   0  30
3  40  40

print (df1.dtypes)
A    int32
B    int32
dtype: object

Ответ 2

Принятое решение работает, если вы не возражаете заполнить пустые ячейки значением, равным нулю. В некоторых случаях пробелы должны оставаться пустыми и не должны заполняться каким-либо числом. В этом случае, если вы замените значения np.nan значениями None, а затем выполните astype (int), он будет работать, и вы сохраните пробелы:

df['A'] = df.A.replace(np.nan,None).astype(int)