web-dev-qa-db-ja.com

pandasでパスを処理する最良の方法

パス付きの_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)
)
_
8
ClementWalter

最も簡単な方法は次のようになります:

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

これはラムダ関数の必要性を省きますが、それでも「パス」にマップする必要があります。

または、次のようにします。

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

後者はWindowsでは機能しませんが(だれが気にしますか?:)、おそらくより高速に実行されます。

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)
   

出力:

0    path1\path2
dtype: object
0
Vishesh Mangla