Pandas DataFrame: mengganti semua nilai dalam kolom, berdasarkan kondisi

132

Saya memiliki DataFrame sederhana seperti berikut:

Pandas DataFrame

Saya ingin memilih semua nilai dari kolom 'Musim Pertama' dan mengganti nilai yang lebih dari tahun 1990 dengan 1. Dalam contoh ini, hanya Baltimore Ravens yang tahun 1996 akan diganti dengan 1 (menjaga data lainnya tetap utuh).

Saya telah menggunakan yang berikut ini:

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

Tapi, ini mengganti semua nilai di baris itu dengan 1, dan bukan hanya nilai di kolom 'Musim Pertama'.

Bagaimana saya bisa mengganti hanya nilai dari kolom itu?

ichimok
sumber

Jawaban:

226

Anda perlu memilih kolom itu:

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

Jadi sintaksnya di sini adalah:

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

Anda dapat memeriksa dokumen dan juga 10 menit untuk panda yang menampilkan semantik

EDIT

Jika Anda ingin membuat indikator boolean, Anda cukup menggunakan kondisi boolean untuk menghasilkan Seri boolean dan mentransmisikan dtype ke intini akan mengonversi Truedan Falsemenjadi 1dan 0masing - masing:

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
EdChum
sumber
40

Agak terlambat ke pesta tapi tetap - saya lebih suka menggunakan numpy di mana:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])
Amir F
sumber
2
Saya mencari solusi untuk menimpa nilai kolom secara kondisional, tetapi berdasarkan nilai kolom lain, seperti ini: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Ini adalah solusi untuk itu.
pengguna582175
Saya mencoba melakukan ini untuk beberapa kondisi seperti ini, tetapi saya terus mendapatkannya ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Apa yang saya coba lakukan pada dasarnya df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Apakah ada yang punya ide tentang ini?
M.Schalk
6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

aneh bahwa tidak ada yang memiliki jawaban ini, satu-satunya bagian yang hilang dari kode Anda adalah ['Musim Pertama'] tepat setelah df dan cukup hapus tanda kurung keriting di dalamnya.

Odz
sumber
Itu memberi 'SettingWithCopyWarning:' Lebih baik menggunakan .loc untuk semua hal seperti dalam jawaban EdChum.
ambitiousdonut
2

untuk kondisi tunggal, yaitu. ( '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

Gunakan ini:

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

oleh karena itu sintaks di sini adalah:

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

Untuk berbagai kondisi yaitu. (df['employrate'] <=55) & (df['employrate'] > 50)

Gunakan ini:

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

oleh karena itu sintaks di sini adalah:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])
Harshit Jain
sumber
0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Penjelasan:

df.locmengambil dua argumen, 'indeks baris' dan 'indeks kolom'. Kami memeriksa apakah nilainya lebih besar dari 27 dari setiap nilai baris, di bawah kolom "Musim pertama" dan kemudian kami menggantinya dengan 1.

Abdullah shafi
sumber