2017-01-09 7 views
11
df 
    A  B 
0 a=10 b=20.10 
1 a=20 NaN 
2 NaN b=30.10 
3 a=40 b=40.10 

Próbowałem:błąd używając astype gdy NaN istnieje w dataframe

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

Ale pojawia się następujący błąd:

ValueError: cannot convert float NaN to integer

oraz:

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

Jak zrobić Naprawię to?

+1

pierwsze 'NaN' może być reprezentowany tylko przez pływaka, więc nie można rzutować na' int' w tym przypadku drugi, jeśli masz mieszane dtypes na przykład napisu, a niektóre inna rzecz, a następnie użycie '' str.extract' zakończy się niepowodzeniem, chociaż mieszane dtypes są obsługiwane, nie jest to dobry pomysł, ponieważ prowadzi do błędów. Powinieneś zdecydować, jaki powinien być ostateczny typ dtype i zastąpić brakujące wartości, które są dla ciebie przydatne – EdChum

Odpowiedz

10

Jeśli brakuje niektórych wartości w kolumnie (NaN), a następnie przekonwertowane na wartości numeryczne, zawszeto float. Nie możesz przekonwertować wartości na int. Tylko do float, ponieważ type z NaN jest float.

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

Zobacz docs jak konwertować wartości, jeżeli przynajmniej jeden NaN:

integer > cast to float64

Jeśli potrzeba int wartości trzeba zastąpić NaN pewnym int, na przykład 0 przez fillna a następnie działa idealnie:

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 
+0

. Bardzo dziękuję za Twoją pomoc. – Sun

Powiązane problemy