Saya memiliki dataset seperti ini:
Contoh Dataframe
import pandas as pd
df = pd.DataFrame({
'names': ['A','B','C','D','E','F','G','H','I','J','K','L'],
'col1': [0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0],
'col2': [0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0]})
Saya ingin mengganti beberapa 0
's di col1
dan col2
dengan 1
' s, tetapi tidak menggantikan 0
's jika tiga atau lebih 0
berturut-turut di kolom yang sama. Bagaimana ini bisa dilakukan dengan panda?
Kumpulan Data Asli:
names col1 col2
A 0 0
B 1 0
C 0 0
D 1 0
E 1 1
F 1 0
G 0 1
H 0 0
I 0 1
J 1 0
K 0 0
L 0 0
Dataset yang Diinginkan:
names col1 col2
A 1 0
B 1 0
C 1 0
D 1 0
E 1 1
F 1 1
G 0 1
H 0 1
I 0 1
J 1 0
K 1 0
L 1 0
col2
?df.loc[(df['col1']+df['col1'].shift(1)+df['col1'].shift(2)>0)&(df['col1']+df['col1'].shift(1)+df['col1'].shift(-1)>0)&(df['col1']+df['col1'].shift(-1)+df['col1'].shift(-2)>0)]=1
Namun, daun ini yang pertama dan terakhir dua baris tersentuhJawaban:
Pertimbangkan pendekatan berikut:
Selangkah demi selangkah:
sumber
col.groupby((col != col.shift()).cumsum())
. catatan :, digroupby(by, ...)
siniby
dapat berupa dikt atau Seri, ketika dikt atau Seri dilewatkan, Seri atau dikt VALUES akan digunakan untuk menentukan grup.Anda harus menggunakan
pandas.DataFrame.shift()
untuk menemukan pola yang Anda butuhkan.Kode:
Kode Tes:
Hasil:
sumber
@Stephen Rauch jawaban sangat cerdas, tetapi lambat ketika saya menerapkannya pada dataset besar. Terinspirasi oleh posting ini , saya pikir saya mendapat cara yang lebih efisien untuk mencapai tujuan yang sama.
Kode:
Hasil:
sumber