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?
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)
)
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.
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