Yanıtlar:
.loc
Etiket 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ç B
ve 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]
:
loc
Boole dizisini pandalara hangi satırları değiştirmek istediğimizi söyleyen bir maske olarak alabilecek gerçeği kullanmakrow_index
loc
kullanmak 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 rows
bir içeren bir tane istiyoruz , bu bir dizi boolean döndürür. 0
df.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.where
df['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 where
yaklaşık 4 kat daha hızlı
.values
iç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
where
görüldüğü gibi kullanın