Panda DataFrame'deki sütun değerlerini değiştirme


141

Bir veri çerçevesinin bir sütunundaki değerleri değiştirmeye çalışıyorum. Sütun ('dişi') yalnızca 'dişi' ve 'erkek' değerlerini içerir.

Aşağıdakileri denedim:

w['female']['female']='1'
w['female']['male']='0' 

Ancak önceki sonuçların tam olarak aynı kopyasını alın.

İdeal olarak aşağıdaki loop element-wise benzer bazı çıktı almak istiyorum.

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

Gotchas belgelerine baktım ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) ama neden hiçbir şeyin olmadığını anlayamıyorum.

Herhangi bir yardım takdir edilecektir.

Yanıtlar:


259

Doğru anlarsam, böyle bir şey istersiniz:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(Burada değerleri sayı içeren dizeler yerine sayılara dönüştürüyorum. Bunları "1"ve "0"gerçekten isterseniz, dönüştürebilirsiniz , ancak neden bunu istediğinizden emin değilim.)

Kullanarak çünkü kod işi değil nedenidir ['female']bir sütun üzerinde (ikinci 'female'Gözlerinde farklı w['female']['female']) değil ortalama "değer 'kadın' olduğunu select satırları" yapar. Dizin 'dişi' olan ve DataFrame'inizde bulunmayan satırları seçmek anlamına gelir .


6
Teşekkürler. Tam aradığım şey. Eğer 'kadın'ı 1'e, başka bir şeyi' 0'a eşleseydim. Bu nasıl olurdu?
Siyah

17
Bunu, sütundaki tüm değerler harita işlevinde verilmişse kullanın. harita işlevinde belirtilmeyen sütun değerleri nan ile değiştirilir.
Chandra

1
Ayrıca .locönlemek için sözdizimini kullanmanızı öneririm SettingWithCopyWarning: pandas.pydata.org/pandas-docs/stable/…
NickBraunagel

2
yerine .map kullandım .replace
JS noob

'' 'Dan nasıl kurtulurum. İki ya da daha fazla sütundaki binlerce kişiyi anlayamıyor. çok teşekkür ederim
M. Mariscal

115

Loc kullanarak bir veri çerçevesinin alt kümesini düzenleyebilirsiniz:

df.loc[<row selection>, <column selection>]

Bu durumda:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

1
Bir koşul aracılığıyla belirli satırları seçmeme gerek kalmadan nasıl uyarlayabilirim, sadece belirli bir sütundaki tüm satırlar? Sütundaki tüm hücreleri belirli bir değere değiştirin.
Dhruv Ghulati

3
@DhruvGhulati, df.loc [:, <sütun seçimi>] kullanırsınız


38

Hafif değişiklik:

w.female.replace(['male', 'female'], [1, 0], inplace=True)

19

Bunun da çalışması gerekir:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0

11

Ayrıca kullanabilirsiniz applyile .getyani

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

Veri çerçevesi w:

   female
0  female
1    male
2  female

applySözlükteki değerleri değiştirmek için kullanma :

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

Sonuç:

   female
0       1
1       0
2       1 

Not: veri apply çerçevesindeki sütunların tüm olası değerleri başka sözlükte tanımlanmışsa sözlük ile kullanılmalıdır, sözlükte tanımlanmamış olanlar için boş olacaktır.


8

Bu çok kompakt:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

Başka bir iyi:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

İlk örnek zincirleme endekslemedir ve elde edilen df'nin bir kopya mı yoksa bir görünüm mü olduğunu garanti edemeyeceği için uyarılır. Zincirleme endekslemeye
Nordle

7

Alternatif olarak, bu tür atamalar için yerleşik pd.get_dummies işlevi vardır:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

Bu, ilkini bıraktığınız w ['dişi'] öğesinde meydana gelen her değer için bir tane olmak üzere iki sütunlu bir veri çerçevesi sağlar (çünkü bunu kalandan çıkarabilirsiniz). Yeni sütun otomatik olarak değiştirdiğiniz dize olarak adlandırılır.

Bu özellikle ikiden fazla olası değere sahip kategorik değişkenleriniz varsa kullanışlıdır. Bu işlev, tüm durumları birbirinden ayırt etmek için gereken sayıda yapay değişken oluşturur. Tüm veri çerçevesini tek bir sütuna atamamaya dikkat edin, bunun yerine w ['kadın'] 'erkek', 'kadın' veya 'nötr' olabilirse, şöyle bir şey yapın:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

Sonra size 'dişi' nin kukla kodlamasını veren iki yeni sütun kalıyor ve dize ile sütundan kurtuldunuz.


4

Kullanımı Series.mapileSeries.fillna

Sütun sadece daha fazla dizeleri içeriyorsa femaleve male, Series.mapbunun dönecektir beri bu durumda başarısız olur NaNdiğer değerler için.

Bu yüzden onu zincirlememiz gerekiyor fillna:

Neden .mapbaşarısız olduğunu gösteren örnek :

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})

   female
0    male
1  female
2  female
3    male
4   other
5   other
df['female'].map({'female': '1', 'male': '0'})

0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object

İçin doğru yöntem, biz zincir mapile fillnabiz dolgu böylece, NaNorijinal sütundaki değerlerle:

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])

0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object

2

Bir fonksiyonu da vardır pandasdenilen factorizeotomatik işin bu tip yapmak için kullanabilirsiniz. Bu sayılara etiketleri dönüştürür: ['male', 'female', 'male'] -> [0, 1, 0]. Daha fazla bilgi için bu cevaba bakınız .


0

Cevapta yukarıda önerilen tüm yöntemlerde hangi nesne türünü almak gerektiğini işaret gerektiğini düşünüyorum: bu Seri veya DataFrame.

Sütunu w.female.veya ile aldığınızda w[[2]](varsayalım ki, sütun sayısı 2'dir) DataFrame'i geri alırsınız. Yani bu durumda DataFrame yöntemlerini kullanabilirsiniz .replace.

Eğer kullandığınız zaman .locya ilocsen Series geri almak ve Seri yok .replacesen gibi yöntemleri kullanmak gerekir, böylece yöntemi apply, mapvb.

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.