De retour de plusieurs colonnes d'appliquer les pandas
J'ai une pandas DataFrame, df_test
. Il contient une colonne "taille" qui représente la taille en octets. J'ai calculé KO, MO et GO en utilisant le code suivant:
df_test = pd.DataFrame([
{'dir': '/Users/uname1', 'size': 994933},
{'dir': '/Users/uname2', 'size': 109338711},
])
df_test['size_kb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0, grouping=True) + ' KB')
df_test['size_mb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0 ** 2, grouping=True) + ' MB')
df_test['size_gb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0 ** 3, grouping=True) + ' GB')
df_test
dir size size_kb size_mb size_gb
0 /Users/uname1 994933 971.6 KB 0.9 MB 0.0 GB
1 /Users/uname2 109338711 106,776.1 KB 104.3 MB 0.1 GB
[2 rows x 5 columns]
J'ai fait ce plus de 120 000 lignes et des fois, il faut environ 2.97 secondes par colonne * 3 = ~9 secondes selon %timeit.
Est-il de toute façon je peux faire ce plus rapide? Par exemple, je peux au lieu de retourner une colonne à la fois d'appliquer et d'exécuter 3 fois, puis-je retourner tous les trois colonnes en une seule passe pour insérer de nouveau dans l'original dataframe?
Les autres questions que j'ai trouvé a tous envie de prendre plusieurs valeurs et retourner une seule valeur. Je veux prendre qu'une seule valeur et retourner plusieurs colonnes.
Vous devez vous connecter pour publier un commentaire.
C'est une vieille question, mais pour être complet, vous pouvez revenir à une Série de l'application d'une fonction qui contient les nouvelles données, la prévention de la nécessité d'effectuer une itération à trois reprises. En passant
axis=1
à l'application de fonction s'applique à la fonctionsizes
à chaque ligne de la dataframe, de retour d'une série à ajouter à un nouveau dataframe. Cette série, s, contenant les nouvelles valeurs, ainsi que les données d'origine.rows_list
dans cette réponse?Utilisation s'appliquent et zip va 3 fois plus vite que la Série sorte.
Résultat du Test sont:
Certaines réponses bien fonctionner, mais je tiens à offrir à une autre, peut-être plus "pandifyed" option. Cela fonctionne pour moi avec le courant pandas 0.23 (pas sûr si cela ne fonctionne pas dans les versions précédentes):
Avis que le truc est sur la
result_type
paramètre deapply
, qui permettra d'élargir son résultat dans unDataFrame
qui peuvent être directement affecter à nouveau/ancien colonnes.Juste anothe lisible. Ce code permettra d'ajouter trois nouvelles colonnes et ses valeurs de retour de la série sans utiliser des paramètres dans l'application de fonction.
Un exemple général de: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html
Généralement, de renvoyer plusieurs valeurs, c'est ce que je fais
Retour d'un dataframe définitivement a ses avantages, mais parfois pas nécessaire. Vous pouvez regarder ce que le
apply()
retourne et jouer un peu avec les fonctions 😉