J'ai un tel DataFrame:
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']})
Je veux obtenir la longueur de la liste après la division sur ":" dans col1, puis je veux écraser les valeurs si longueur> 2 OU ne pas écraser les valeurs si longueur <= 2.
Idéalement, en une seule ligne aussi vite que possible.
Actuellement, j'essaye mais il retourne ValueError.
df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])
EDIT: condition sur col1. EDIT2: merci pour toutes les bonnes réponses fournies rapidement. incroyable! EDIT3: chronométrage sur 10 ^ 6 lignes:
@ansev 3.2657s
@jezrael 0.8922s
@ anky_91 1.9511s
col2
oucol1
?Réponses:
Utilisez
Series.str.count
, ajoutez1
, comparez parSeries.gt
et attribuez la liste aux colonnes filtrées de la liste:la source
gt(1)
au lieu d'ajouter 1 etgt(2)
?Vous avez besoin
series.str.len()
après la division pour déterminer la longueur de la liste, puis vous pouvez comparer et utiliser.loc[]
, affecter la liste partout où la condition correspond:la source
Une autre approche est
Series.str.split
avecexpand = True
etDataFrame.count
avecaxis=1
.la source