Pandalar veri çerçevesinde bir hücreyi NaN olarak ayarlama


104

Bir veri çerçevesi sütunundaki hatalı değerleri NaN'ler ile değiştirmek istiyorum.

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

Yine de, son satır başarısız olur ve bir df kopyası üzerinde çalıştığı için bir uyarı verir. Peki bunu halletmenin doğru yolu nedir? İloc veya ix ile birçok çözüm gördüm ama burada bir boole koşulu kullanmam gerekiyor.


Başlığın yanıltıcı olduğunu hissediyorum. Sorun, veri çerçevenizde NaN istemeniz değil. Sorun şu ki, "bir DataFrame'den bir dilim kopyasına ayarlanmaya çalışıyorsunuz".
Teepeemm

Yanıtlar:



14

Kullanmak replacesorunu çözecek gibi görünse de, bir alternatif önermek isterim. Sütundaki sayısal ve bazı dize değerlerinin karışımında, dizelerin np.nan ile değiştirilmemesi, ancak tüm sütunun uygun hale getirilmesi sorunu. Bahse girerim, orijinal sütun büyük olasılıkla bir nesne türündedir

Name: y, dtype: object

Gerçekten ihtiyacınız olan şey, onu sayısal bir sütun haline getirmektir (uygun türe sahip olacak ve oldukça hızlı olacaktır), tüm sayısal olmayan değerler NaN ile değiştirilmiştir.

Bu nedenle, iyi bir dönüşüm kodu,

pd.to_numeric(df['y'], errors='coerce')

errors='coerce'Sayısal bir değere ayrıştırılamayan dizeleri NaN olmaya zorlamak için belirtin . Sütun türü

Name: y, dtype: float64

10

Değiştir'i kullanabilirsiniz:

df['y'] = df['y'].replace({'N/A': np.nan})

Ayrıca inplaceparametresinin farkında olun replace. Şunun gibi bir şey yapabilirsiniz:

df.replace({'N/A': np.nan}, inplace=True)

Bu, bir kopya oluşturmadan df'deki tüm örnekleri değiştirecektir.

Benzer şekilde, boş dize veya Yok değeri gibi diğer bilinmeyen değer türleriyle karşılaşırsanız:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

Referans: En Son Pandalar - Değiştirin


3

Pandas 1.0.0'dan itibaren, veri çerçevenizde boş değerler oluşturmak için artık numpy kullanmanız gerekmiyor. Bunun yerine, sadece pandas.NA'yı (pandas._libs.missing.NAType türünde) kullanabilirsiniz, bu nedenle veri çerçevesi içinde boş olarak değerlendirilir, ancak veri çerçevesi bağlamı dışında boş olmaz.


Bu OP'nin problemini çözmese de, başlıktaki soruyu cevapladığı için oy verdim.
Teepeemm

1
df.loc[df.y == 'N/A',['y']] = np.nan

Bu, sorununuzu çözer. Double [] ile, DataFrame'in bir kopyası üzerinde çalışıyorsunuz. Değiştirebilmek için bir aramada tam konum belirlemeniz gerekir.


0

Bu parçacıkları deneyebilirsiniz.

[16] 'da: verilerim = {' x ': [10, 50, 18, 32, 47, 20],' y ': [' 12 ',' 11 ',' Yok ',' 13 ',' 15 ',' Yok ']}
[17] 'de: df = pd.DataFrame (mydata)

[18] 'de: df.y [df.y == "N / A"] = np.nan

Çıkış [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.