pandalar, bir sütundaki değerlerin durumuna göre aynı anda birden çok sütundaki değerlerin üzerine yazar


11

Böyle bir DataFrame var:

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']})

Ben col1 ":" bölündükten sonra listenin uzunluğunu almak istiyorum, sonra uzunluk> 2 VEYA uzunluk <= 2 ise değerlerin üzerine değil değerleri üzerine yazmak istiyorum.

İdeal olarak, mümkün olduğunca hızlı bir şekilde.

Şu anda deniyorum ama ValueError döndürüyor.

df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])

EDIT: col1'deki durum. EDIT2: tüm harika ve hızlı bir şekilde sağlanan cevaplar için teşekkür ederim. inanılmaz! EDIT3: 10 ^ 6 satırda zamanlama:

@ansev 3.2657s

@ErkekTerimleri

@ anky_91 1.9511s


Durum açık mı col2yoksa col1?
anishtain4

Hata için özür dilerim. Bu col1'dir.
dkrynicki

Yanıtlar:


8

Listedeki filtrelenmiş sütunları kullanın Series.str.count, ekleyin 1, karşılaştırın Series.gtve listeye atayın:

df.loc[df['col1'].str.count(":").add(1).gt(2), ['col1','col2','col3']] = ["", "", False]
print (df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

2
Geçici bir bölünme saklamadığı için en iyi cevap budur, ancak neden gt(1)1 ve eklemek yerine kullanmıyorsunuz gt(2)?
anishtain4

@ anishtain4 - yop, katılıyorum
jezrael

10

series.str.len()Listenin uzunluğunu belirlemek için bölündükten sonra ihtiyacınız olacak , ardından karşılaştırıp kullanarak .loc[], koşulun eşleştiği her yerde listeyi atayabilirsiniz:

df.loc[df['col1'].str.split(":").str.len()>2,['col1','col2','col3']]=["", "", False]
print(df)

   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

5

Başka bir yaklaşım Series.str.splitile expand = Trueve DataFrame.countile axis=1.

df.loc[df['col1'].str.split(":",expand = True).count(axis=1).gt(2),['col1','col2','col3']]=["", "", False]
print(df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa
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.