Saya memiliki DataFrame tersebut:
df = pd.DataFrame(data={
'col0': [11, 22,1, 5]
'col1': ['aa:a:aaa', 'a:a', 'a', 'a:aa:a:aaa'],
'col2': ["foo", "foo", "foobar", "bar"],
'col3': [True, False, True, False],
'col4': ['elo', 'foo', 'bar', 'dupa']})
Saya ingin mendapatkan panjang daftar setelah dipisah pada ":" di col1, maka saya ingin menimpa nilai jika panjang> 2 ATAU tidak menimpa nilai jika panjang <= 2.
Idealnya, dalam satu baris secepat mungkin.
Saat ini, saya mencoba tetapi mengembalikan ValueError.
df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])
EDIT: kondisi pada col1. EDIT2: terima kasih atas semua jawaban yang bagus dan cepat diberikan. luar biasa! EDIT3: waktu pada 10 ^ 6 baris:
@ansev 3.2657s
@jezrael 0.8922s
@ anky_91 1.9511s
col2
ataucol1
?Jawaban:
Gunakan
Series.str.count
, tambahkan1
, bandingkan dengan,Series.gt
dan tetapkan daftar ke kolom yang difilter dalam daftar:sumber
gt(1)
alih-alih menambahkan 1 dangt(2)
?Anda perlu
series.str.len()
setelah memisahkan untuk menentukan panjang daftar, kemudian Anda dapat membandingkan dan menggunakan.loc[]
, menetapkan daftar di mana pun kondisi cocok:sumber
Pendekatan lain adalah
Series.str.split
denganexpand = True
danDataFrame.count
denganaxis=1
.sumber