web-dev-qa-db-fra.com

Meilleur moyen de gérer le chemin avec pandas

Quand j'ai un pd.DataFrame Avec des chemins, je finis par faire beaucoup de .map(lambda path: Path(path).{method_name}, ou apply(axis=1) par exemple:

(
    pd.DataFrame({'base_dir': ['dir_A', 'dir_B'], 'file_name': ['file_0', 'file_1']})
    .assign(full_path=lambda df: df.apply(lambda row: Path(row.base_dir) / row.file_name, axis=1))
)
  base_dir file_name     full_path
0    dir_A    file_0  dir_A/file_0
1    dir_B    file_1  dir_B/file_1

Cela me semble étrange surtout parce que pathlib implémente / Pour que quelque chose comme df.base_dir / df.file_name Soit plus pythonique et naturel.

Je n'ai trouvé aucun type path implémenté dans les pandas, y a-t-il quelque chose qui me manque?

ÉDITER

J'ai trouvé qu'il valait peut-être mieux faire une fois pour toutes une sorte de astype(path) alors au moins pour la concaténation de chemin avec pathlib il est vectorisé:

(
    pd.DataFrame({'base_dir': ['dir_A', 'dir_B'], 'file_name': ['file_0', 'file_1']})
    # this is where I would expect `astype({'base_dir': Path})`
    .assign(**{col_name:lambda df: df[col_name].map(Path) for col_name in ["base_dir", "file_name"]})
    .assign(full_path=lambda df: df.base_dir / df.file_name)
)
8
ClementWalter

Il semble que le moyen le plus simple serait:

df.base_dir.map(Path) / df.file_name.map(Path)

Cela évite d'avoir besoin d'une fonction lambda, mais vous devez toujours mapper sur "Path".

Sinon, faites simplement:

df.base_dir.str.cat(df.file_name, sep="/")

Ce dernier ne fonctionnera pas sous Windows (peu importe, non? :) mais fonctionnera probablement plus vite.

1
Roy2012
import pandas as pd
import os
   
df = pd.DataFrame({"p1":["path1"],"p2":["path2"]})
df.apply(lambda x:os.path.join(x.p1, x.p2), axis=1)
   

Production:

0    path1\path2
dtype: object
0
Vishesh Mangla