Pandalarda türleri dönüştürmek için üç ana seçeneğiniz vardır:
to_numeric()
- sayısal olmayan türleri (ör. dizeler) uygun bir sayısal türe güvenli bir şekilde dönüştürmek için işlevsellik sağlar. (Ayrıca bkz . to_datetime()
Ve to_timedelta()
.)
astype()
- herhangi bir türü (neredeyse) başka herhangi bir türe dönüştürmek (neredeyse mantıklı olmasa bile). Ayrıca kategorik türlere dönüştürmenize izin verir (çok yararlı).
infer_objects()
- mümkünse Python nesnelerini tutan nesne sütunlarını panda türüne dönüştürmek için bir yardımcı yöntem.
Bu yöntemlerin her birinin daha ayrıntılı açıklaması ve kullanımı için okumaya devam edin.
1. to_numeric()
Bir DataFrame sütununun bir veya daha fazla sütununu sayısal değerlere dönüştürmenin en iyi yolu kullanmaktır pandas.to_numeric()
.
Bu işlev, sayısal olmayan nesneleri (dizeler gibi) tamsayılara veya kayan nokta sayılarına uygun şekilde değiştirmeye çalışır.
Temel kullanım
Girilen girdi to_numeric()
bir Seri veya DataFrame öğesinin tek sütunudur.
>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0 8
1 6
2 7.5
3 3
4 0.9
dtype: object
>>> pd.to_numeric(s) # convert everything to float values
0 8.0
1 6.0
2 7.5
3 3.0
4 0.9
dtype: float64
Gördüğünüz gibi yeni bir Seri geri döndü. Bu çıktıyı kullanmaya devam etmek için bir değişkene veya sütun adına atamayı unutmayın:
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
Bu apply()
yöntemi kullanarak bir DataFrame öğesinin birden çok sütununu dönüştürmek için de kullanabilirsiniz :
# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame
# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
Değerlerinizin tümü dönüştürülebildiği sürece, muhtemelen ihtiyacınız olan şey budur.
Hata yönetimi
Ancak, bazı değerler sayısal bir türe dönüştürülemezse ne olur?
to_numeric()
ayrıca errors
sayısal olmayan değerlerin zorlanmasını NaN
veya yalnızca bu değerleri içeren sütunları yok saymanızı sağlayan bir anahtar kelime bağımsız değişkeni de alır .
İşte s
dtype nesnesine sahip bir dizi Dizeyi kullanan bir örnek :
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
Varsayılan davranış, bir değeri dönüştüremezse yükseltmektir. Bu durumda, 'pandalar' dizesiyle baş edemez:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
Başarısız olmak yerine, 'pandaların' eksik / hatalı sayısal değer olarak kabul edilmesini isteyebiliriz. Anahtar kelime bağımsız değişkenini NaN
kullanarak geçersiz değerleri aşağıdaki gibi zorlayabiliriz errors
:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
Üçüncü seçenek errors
, geçersiz bir değerle karşılaşıldığında işlemi yoksaymaktır:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
Bu son seçenek özellikle tüm DataFrame'inizi dönüştürmek istediğinizde yararlıdır, ancak hangi sütunlarımızın güvenilir bir şekilde sayısal bir türe dönüştürülebileceğini bilmiyorum. Bu durumda şunu yazın:
df.apply(pd.to_numeric, errors='ignore')
İşlev, DataFrame öğesinin her sütununa uygulanır. Sayısal bir türe dönüştürülebilen sütunlar dönüştürülürken (örneğin, rakam olmayan dizeler veya tarihler içerir) sütunlar tek başına bırakılır.
downcasting
Varsayılan olarak, ile dönüşüm to_numeric()
size bir int64
veyafloat64
dtype (veya platformunuz için yerel olan tamsayı genişliği) verir.
Genellikle istediğiniz şey budur, ancak ya biraz bellek kaydetmek ve daha kompakt bir tür kullanmak isterseniz float32
, ya da int8
?
to_numeric()
size 'tamsayı', 'imzalı', 'imzasız', 'kayan' öğelerine yer değiştirme seçeneği sunar. Basit bir s
tamsayı serisi serisine örnek :
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
'İnteger' değerine küçültme değerleri tutabilen mümkün olan en küçük tamsayıyı kullanır:
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
'Şamandıra' için alt çizgi aynı şekilde normal yüzer tipten daha küçük alır:
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
2. astype()
astype()
Yöntem size DataFrame veya Serisi istiyorum d_type hakkında açık olmasını sağlar. Bir türden diğerine geçmeyi denemeniz çok yönlüdür.
Temel kullanım
Sadece bir tür seçin: NumPy dtype (ör. np.int16
), Bazı Python türleri (örneğin bool) veya pandalara özgü türler (kategorik dtype gibi) kullanabilirsiniz.
Dönüştürmek istediğiniz nesnenin yöntemini çağırın ve sizin için dönüştürmeye astype()
çalışın:
# convert all DataFrame columns to the int64 dtype
df = df.astype(int)
# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})
# convert Series to float16 type
s = s.astype(np.float16)
# convert Series to Python strings
s = s.astype(str)
# convert Series to categorical type - see docs for more details
s = s.astype('category')
"Denemek" dedim - astype()
Seri veya DataFrame bir değeri nasıl dönüştürüleceğini bilmiyorsanız, bir hata ortaya çıkarır. Örneğin, bir NaN
veyainf
değeriniz varsa, bunu bir tamsayıya dönüştürmeye çalışırken bir hata alırsınız.
Pandalar 0.20.0'dan itibaren, bu hata iletilerek bastırılabilir errors='ignore'
. Orijinal nesnenize dokunulmaz.
Dikkatli ol
astype()
güçlüdür, ancak bazen değerleri "yanlış" dönüştürür. Örneğin:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
Bunlar küçük tamsayılardır, bu yüzden bellek tasarrufu yapmak için işaretsiz bir 8 bit tipine dönüştürmeye ne dersiniz?
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
Dönüştürme işe yaradı, ancak -7 249 olacak şekilde sarıldı (yani 2 8 - 7)!
pd.to_numeric(s, downcast='unsigned')
Bunun yerine kullanarak indirmeye çalışmak bu hatayı önlemeye yardımcı olabilir.
3. infer_objects()
Pandaların 0.21.0 sürümü infer_objects()
, bir nesne veri tipine sahip bir DataFrame sütunlarını daha spesifik bir türe (yumuşak dönüşümler) dönüştürmek için bir yöntem getirmiştir.
Örneğin, iki nesne türü sütununa sahip bir DataFrame. Biri gerçek tamsayıları, diğeri tamsayıları temsil eden dizeleri tutar:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
Kullanarak infer_objects()
, 'a' sütununun türünü int64 olarak değiştirebilirsiniz:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
'B' sütunu, değerleri tamsayı değil dize olduğundan tek başına bırakılmıştır. Her iki sütunun bir tamsayı türüne dönüştürülmesini denemek ve zorlamak istiyorsanız, df.astype(int)
bunun yerine kullanabilirsiniz .