パス付きの_pd.DataFrame
_があると、多くの.map(lambda path: Path(path).{method_name}
、またはapply(axis=1)
を実行することになります。例:
_(
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
_
特にpathlib
が_/
_を実装しているため、_df.base_dir / df.file_name
_のようなものがよりPython的で自然なものになるので、私には奇妙に思われます。
パンダに実装されているpath
タイプを見つけていませんが、何か不足していますか?
私は、すべての種類のastype(path)
を1回実行してから、少なくともpathlib
を使用したパス連結の場合に、ベクトル化する方がよいことを発見しました。
_(
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)
)
_
最も簡単な方法は次のようになります:
df.base_dir.map(Path) / df.file_name.map(Path)
これはラムダ関数の必要性を省きますが、それでも「パス」にマップする必要があります。
または、次のようにします。
df.base_dir.str.cat(df.file_name, sep="/")
後者はWindowsでは機能しませんが(だれが気にしますか?:)、おそらくより高速に実行されます。
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)
出力:
0 path1\path2
dtype: object