Garfield
YZF Admin
Bir pandas DataFrame’i NumPy dizisine çevirirken tek bir
Dönüşümden önce her sütunun pandas türünü ve elde edilen NumPy türünü ayrı ayrı kontrol edin.
Bu örnekte
DataFrame’in bütün sütunları aynı tür ailesindeyse hedef türü açıkça belirlemek sonucu öngörülebilir kılar. Örneğin yalnızca tamsayı verileri içeren bir DataFrame’i
Beklenen çıktı aşağıdaki yapıdadır:
Buradaki
Normal NumPy dizileri tek bir
Örneğin:
Bu durumda sonuç benzeri bir yapı elde edilir:
Her sütunun türünü korumak için en güvenilir yaklaşım sütunları ayrı NumPy dizilerine dönüştürmektir:
Böylece her dizi kendi NumPy
Eğer tek bir NumPy nesnesi içinde alan adlarını ve farklı alan türlerini korumanız gerekiyorsa yapılandırılmış dizi kullanılabilir; ancak bu yapı normal iki boyutlu dizi gibi davranmaz ve alanlara isimleriyle erişilir. Çoğu uygulamada sütunları ayrı diziler olarak saklamak daha anlaşılırdır.
Eksik değerler tür seçimini değiştirebilir. Örneğin tamsayı sütununa
Amaç kesin olarak
Tek tip sayısal veriyle çalışıyorsanız
dtype seçilir; bu nedenle veri türleri ancak bütün sütunlar ortak bir NumPy türünde birleşebiliyorsa aynen korunur. Sayısal sütunlar için df.to_numpy(dtype=...) kullanılabilir, ancak metin, sayı ve tarih gibi farklı türler birlikteyse sonuç çoğunlukla object olur. Sütunların ayrı veri türlerini kaybetmeden korumak istiyorsanız tek bir normal NumPy dizisi yerine sütunları ayrı ayrı dönüştürmeniz veya yapılandırılmış dizi kullanmanız gerekir.Önce DataFrame türlerini kontrol edin
Dönüşümden önce her sütunun pandas türünü ve elde edilen NumPy türünü ayrı ayrı kontrol edin.
DataFrame.dtypes sütun bazındaki türleri, to_numpy().dtype ise tek parça dizinin ortak türünü gösterir.
Python:
import pandas as pd
df = pd.DataFrame({
"adet": pd.Series([1, 2, 3], dtype="int64"),
"fiyat": pd.Series([10.5, 20.0, 7.25], dtype="float64")
})
print(df.dtypes)
print(df.to_numpy().dtype)
Bu örnekte
adet ve fiyat sütunları sayısal olduğu için NumPy, ortak tür olarak genellikle float64 seçer. Tamsayı sütunundaki değerler bu işlemle küsuratlı görünse de sayısal bilgi kaybolmaz; ancak sütunun özgün int64 türü tek başına korunmuş olmaz.Ortak bir veri türüne güvenli biçimde dönüştürme
DataFrame’in bütün sütunları aynı tür ailesindeyse hedef türü açıkça belirlemek sonucu öngörülebilir kılar. Örneğin yalnızca tamsayı verileri içeren bir DataFrame’i
int64 olarak alabilirsiniz:- DataFrame’in sütun türlerini doğrulayın.
df.dtypesçıktısında dönüştürülemeyecek metin, eksik değer veya farklı tür bulunmadığından emin olun. - Hedef NumPy türünü belirtin.
arr = df.to_numpy(dtype="int64")ifadesi bütün değerleri bu türe dönüştürmeyi ister; kayıpsız dönüşüm garantisi vermez. Örneğin kesirli kayan noktalı değerler tamsayıya çevrilirken kesirleri atılabilir. Hedef türü seçmeden önce değerlerin aralıklarını, kesir içerip içermediğini ve eksikliği doğrulayın. - Sonucu kontrol edin.
arr.dtypedeğerininint64,arr.shapedeğerinin ise DataFrame’in satır ve sütun sayısıyla eşleştiğini doğrulayın.
Python:
df = pd.DataFrame({
"x": [1, 2, 3],
"y": [4, 5, 6]
})
arr = df.to_numpy(dtype="int64")
print(arr)
print(arr.dtype)
print(arr.shape)
Beklenen çıktı aşağıdaki yapıdadır:
Kod:
[[1 4]
[2 5]
[3 6]]
int64
(3, 2)
Buradaki
int64, dizideki tüm değerlerin ortak veri türünü gösterir. Bu çıktı, DataFrame’de her sütunun bağımsız tür bilgisinin saklandığı anlamına gelmez.Farklı sütun türleri birlikteyse ne olur?
Normal NumPy dizileri tek bir
dtype taşır. Bu nedenle sütun türleri farklı olduğunda NumPy ortak bir tür seçer veya değerleri object olarak saklar.| DataFrame içeriği | Olası dizi türü | Sonuç |
|---|---|---|
| Yalnızca tamsayılar | int64 | Tür ortak biçimde korunabilir. |
| Tamsayı ve ondalıklı sayı | float64 | Tamsayılar ortak ondalıklı türe yükseltilebilir. |
| Sayı ve metin | object veya metin türü | Tek dizide özgün sütun türlerini ayrı ayrı korumak mümkün değildir. |
| Tarih ve sayı | object veya ortak dönüştürülmüş tür | Tarih sütununun türünü ayrıca doğrulamak gerekir. |
Python:
df = pd.DataFrame({
"adet": [1, 2],
"etiket": ["A", "B"]
})
arr = df.to_numpy()
print(arr)
print(arr.dtype)
Bu durumda sonuç benzeri bir yapı elde edilir:
Kod:
[[1 'A']
[2 'B']]
object
object sonucu, değerlerin Python nesneleri olarak tutulabildiğini gösterir; fakat her sütunun pandas türünün ayrıntılı biçimde korunduğunu kanıtlamaz. Özellikle sayısal hesaplama yapacaksanız bu diziyi doğrudan kullanmak yerine ilgili sütunu ayrı alın.Sütun türlerini gerçekten ayrı ayrı koruma
Her sütunun türünü korumak için en güvenilir yaklaşım sütunları ayrı NumPy dizilerine dönüştürmektir:
Python:
df = pd.DataFrame({
"adet": pd.Series([1, 2, 3], dtype="int64"),
"fiyat": pd.Series([10.5, 20.0, 7.25], dtype="float64"),
"etiket": pd.Series(["A", "B", "C"], dtype="string")
})
adet = df["adet"].to_numpy()
fiyat = df["fiyat"].to_numpy()
etiket = df["etiket"].to_numpy()
print(adet.dtype)
print(fiyat.dtype)
print(etiket.dtype)
Böylece her dizi kendi NumPy
dtype değerini taşır; fakat pandas’ın genişletilmiş tür bilgisi her zaman aynen korunmaz. Örneğin string sütunu bu dönüşümde object dizisi verebilir; nullable tamsayıların eksiklik gösterimi de değişebilir. Sütunları ayrı dönüştürmek ortak türe zorlamayı önler, ancak her sonucun dtype değerini ve eksik değer gösterimini yine kontrol edin.Eğer tek bir NumPy nesnesi içinde alan adlarını ve farklı alan türlerini korumanız gerekiyorsa yapılandırılmış dizi kullanılabilir; ancak bu yapı normal iki boyutlu dizi gibi davranmaz ve alanlara isimleriyle erişilir. Çoğu uygulamada sütunları ayrı diziler olarak saklamak daha anlaşılırdır.
Eksik değerleri dönüşümden önce değerlendirin
Eksik değerler tür seçimini değiştirebilir. Örneğin tamsayı sütununa
NaN eklenmesi, klasik NumPy tamsayı dizisiyle uyumsuz olabilir; pandas bu durumda genişletilmiş tamsayı türü veya kayan nokta türü kullanabilir. Bu yüzden dönüşümden önce şu kontrolleri yapın:
Python:
print(df.dtypes)
print(df.isna().sum())
print(df.to_numpy().dtype)
Amaç kesin olarak
int64 almaksa eksik değerleri nasıl ele alacağınızı önce belirleyin: eksik satırları kaldırmak, geçerli bir varsayılan değer atamak veya eksikliği destekleyen uygun bir tür kullanmak. Eksik değerleri rastgele sıfırla doldurmak, veri anlamını değiştirebilir.Hangi yöntemi seçmelisiniz?
Tek tip sayısal veriyle çalışıyorsanız
to_numpy(dtype="float64") veya to_numpy(dtype="int64") kullanın ve dönüşümden sonra dtype ile şekli kontrol edin. Sütunlar farklı türlerdeyse tek bir iki boyutlu dizide türleri bağımsız biçimde koruyamazsınız; sütunları ayrı ayrı to_numpy() ile alın. object sonucu oluştuğunda bunu başarı göstergesi saymayın; beklenen hesaplamaları yapabilmek için gerçek sütun türlerini ve eksik değerleri ayrıca doğrulayın.