Yanıtlar:
.locEtiket tabanlı indeksleme için kullanın :
df.loc[df.A==0, 'B'] = np.nan
df.A==0İfade endeksleri satırlar, bu bir boolean dizi oluşturur 'B'sütunu seçer. Bunu, bir sütunun alt kümesini dönüştürmek için de kullanabilirsiniz, örneğin:
df.loc[df.A==0, 'B'] = df.loc[df.A==0, 'B'] / 2
Tam olarak neden işe yaradığını bilmek panda iç hakkında yeterli bilmiyorum, ancak temel sorun bazen bir DataFrame içine dizinleme sonucunun bir kopyasını döndürür ve bazen orijinal nesne üzerinde bir görünüm döndürür. Buradaki belgelere göre , bu davranış altta yatan numpy davranışına bağlıdır. Her şeye tek bir işlemde erişmenin ([bir] [iki] yerine) ayar için işe yarama olasılığının daha yüksek olduğunu gördüm.
İşte gelişmiş endeksleme üzerinde panda dokümanlardan geçerli:
Bu bölüm tam olarak neye ihtiyacınız olduğunu açıklayacaktır! Çıkıyor df.loc(.ix kullanımdan kaldırıldı olarak - aşağıda belirttiğimiz birçok gibi) bir dataframe ait zar atıyor / serin dilimleme için kullanılabilir. Ve. Bir şeyleri ayarlamak için de kullanılabilir.
df.loc[selection criteria, columns I want] = value
Bren'in cevabı, 'beni tüm yerleri bul df.A == 0, sütun seç Bve np.nan'
loc[selection criteria, columns I want]aklına mükemmel bir şekilde yapışıyor ...
Pandalar 0.20 ix'den itibaren kullanımdan kaldırıldı . Doğru yol df.loc kullanmaktır
İşte çalışan bir örnek
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
>>>
Dokümana açıklandığı gibi burada , .loc öncelikle temel etiketlemek, aynı zamanda, bir Boole dizi ile kullanılabilir .
Yukarıda yaptığımız şey şu şekildedir df.loc[row_index, column_index]:
locBoole dizisini pandalara hangi satırları değiştirmek istediğimizi söyleyen bir maske olarak alabilecek gerçeği kullanmakrow_index lockullanmak ayrıca 'B',column_index Mantıksal, koşul veya boolean dizisini oluşturmak için bir dizi boolean döndüren herhangi bir işlemi kullanabiliriz. Yukarıdaki örnekte, aşağıdaki örnekte de görebileceğiniz gibi , kullanabileceğimiz rowsbir içeren bir tane istiyoruz , bu bir dizi boolean döndürür. 0df.A == 0
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df
A B
0 0 2
1 1 0
2 0 5
>>> df.A == 0
0 True
1 False
2 True
Name: A, dtype: bool
>>>
Ardından, gerekli satırları seçmek ve değiştirmek için yukarıdaki booleans dizisini kullanırız:
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
Daha fazla bilgi için gelişmiş indeksleme belgelerini kontrol buraya .
Devasa bir hız artışı için NumPy'nin burada işlevini kullanın.
Bazı sıfırlarla 100.000 satır içeren iki sütunlu bir DataFrame oluşturun.
df = pd.DataFrame(np.random.randint(0,3, (100000,2)), columns=list('ab'))
numpy.wheredf['b'] = np.where(df.a.values == 0, np.nan, df.b.values)
%timeit df['b'] = np.where(df.a.values == 0, np.nan, df.b.values)
685 µs ± 6.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.loc[df['a'] == 0, 'b'] = np.nan
3.11 ms ± 17.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Numpy's whereyaklaşık 4 kat daha hızlı
.valuesiçinde np.where(df.a.values == 0, np.nan, df.b.values)? np.where(df.a == 0, np.nan, df.b)Ayrıca çalışıyor gibi görünüyor ?
Birden çok sütunu değiştirmek için aşağıdakileri kullanarak numpy dizisine dönüştürün .values:
df.loc[df.A==0, ['B', 'C']] = df.loc[df.A==0, ['B', 'C']].values / 2
wheregörüldüğü gibi kullanın