Pandas DataFrame: bir sütundaki tüm değerleri duruma göre değiştirin


132

Aşağıdaki gibi basit bir DataFrame'im var:

Pandas DataFrame

'İlk Sezon' sütunundaki tüm değerleri seçmek ve 1990'dan büyük olanları 1 ile değiştirmek istiyorum. Bu örnekte, yalnızca Baltimore Kuzgunları 1996'yı 1 ile değiştirecektir (verilerin geri kalanını olduğu gibi koruyarak).

Aşağıdakileri kullandım:

df.loc[(df['First Season'] > 1990)] = 1

Ancak, yalnızca 'İlk Sezon' sütunundaki değerleri değil, bu satırdaki tüm değerleri 1 ile değiştirir.

Yalnızca o sütundaki değerleri nasıl değiştirebilirim?

Yanıtlar:


226

Bu sütunu seçmeniz gerekiyor:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

Yani buradaki sözdizimi:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Dokümanları ve ayrıca semantiği gösteren pandalara 10 dakikayı kontrol edebilirsiniz.

DÜZENLE

Eğer bir boolean göstergeyi oluşturmak istiyorsanız o zaman sadece bir boolean Serisi oluşturmak için boolean durumunu kullanmak ve d_type yayınlayabilirsiniz intbu dönüştürür Trueve Falsekarşı 1ve 0sırasıyla:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003

40

Partiye biraz geç ama yine de - burada numpy kullanmayı tercih ederim:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
Sütun değerlerinin üzerine koşullu olarak ancak başka bir sütunun değerine dayalı olarak bir çözüm arıyordum, şöyle: df ['col1'] = np.where (df ['id'] == '318431682259014', 'YENİ', df ['col1']) Bunun çözümü buydu.
user582175

Bunu bunun gibi birden çok koşul için yapmaya çalışıyorum ama almaya devam ediyorum ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Yapmaya çalıştığım şey temelde df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Bunun hakkında bir fikri olan var mı?
M.Schalk

6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

Kimsenin bu cevaba sahip olmaması garip, kodunuzun tek eksik kısmı df'den hemen sonraki ['İlk Sezon'] ve sadece içindeki kıvrımlı parantezleri kaldırın.


Bu bir 'SettingWithCopyWarning' verir: 'EdChum'un cevabında olduğu gibi tüm şey için .loc kullanmak daha iyidir.
ambitiousdonut

2

tek koşul için, yani. ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

bunu kullan:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

bu nedenle sözdizimi burada:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Birden çok koşul için, yani. (df['employrate'] <=55) & (df['employrate'] > 50)

bunu kullan:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

bu nedenle sözdizimi burada:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Açıklama:

df.loc'satır dizini' ve 'sütun dizini' olmak üzere iki bağımsız değişken alır. Değerin her satır değerinden 27'den büyük olup olmadığını kontrol ediyoruz, "İlk sezon" sütunu altında ve ardından onu 1 ile değiştiriyoruz.

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.