J'ai un dataframe comme ceci:
CreationDate
2013-12-22 15:25:02 [ubuntu, mac-osx, syslinux]
2009-12-14 14:29:32 [ubuntu, mod-rewrite, laconica, Apache-2.2]
2013-12-22 15:42:00 [ubuntu, nat, squid, mikrotik]
Je calcule la longueur des listes dans la colonne CreationDate
et crée une nouvelle colonne Length
comme celle-ci:
df['Length'] = df.CreationDate.apply(lambda x: len(x))
Ce qui me donne ceci:
CreationDate Length
2013-12-22 15:25:02 [ubuntu, mac-osx, syslinux] 3
2009-12-14 14:29:32 [ubuntu, mod-rewrite, laconica, Apache-2.2] 4
2013-12-22 15:42:00 [ubuntu, nat, squid, mikrotik] 4
Existe-t-il un moyen plus pythonique de le faire?
Vous pouvez également utiliser l'accesseur str
pour certaines opérations de liste. Dans cet exemple,
df['CreationDate'].str.len()
renvoie la longueur de chaque liste. Voir la documentation pour str.len
.
df['Length'] = df['CreationDate'].str.len()
df
Out:
CreationDate Length
2013-12-22 15:25:02 [ubuntu, mac-osx, syslinux] 3
2009-12-14 14:29:32 [ubuntu, mod-rewrite, laconica, Apache-2.2] 4
2013-12-22 15:42:00 [ubuntu, nat, squid, mikrotik] 4
Pour ces opérations, Vanilla Python est généralement plus rapide. pandas gère les NaN. Cependant, voici les timings:
ser = pd.Series([random.sample(string.ascii_letters,
random.randint(1, 20)) for _ in range(10**6)])
%timeit ser.apply(lambda x: len(x))
1 loop, best of 3: 425 ms per loop
%timeit ser.str.len()
1 loop, best of 3: 248 ms per loop
%timeit [len(x) for x in ser]
10 loops, best of 3: 84 ms per loop
%timeit pd.Series([len(x) for x in ser], index=ser.index)
1 loop, best of 3: 236 ms per loop