熊猫使用部分字符串映射数据帧

时间:2019-10-21 08:14:00

标签: python pandas dataframe

我有两个数据帧(dfdf_ref),后者包含一个键和值,应映射到df

挑战在于,由于引用中包含的字符串与df中包含的字符串仅部分重叠,因此我无法直接映射df_refdf中的相应列。

df看起来像这样:

    path            filesize    ctime
0   /pathA/stuff    171.0       Tue Dec 17 01:50:17 CET 2013
1   /pathB/stuff2   162.0       Tue Dec 17 01:50:17 CET 2013
2   /pathA/stuff2   156.0       Tue Dec 17 01:50:17 CET 2013

df_ref看起来像这样:

    path                            owner
0   /stuff/longer/pathA/stuff       foo
1   /stuff/longer/bla/pathB/stuff2  bar
2   /stuff/stuff/pathA/stuff2/temp  baz

我想对齐列path上的两个数据框,并将owner中的df_ref添加到df

产生了我当前的思路(部分代码说明了工作流程):

import pandas as pd
import numpy as np

pattern = r'^(?:\/[^\/]+){2}(\/([^\/]+\/?[^\/]+\/?){2,3})'
df_ref["partial_path"] = df_ref["path"].str.extract(pattern, expand=False)[0]


for row, data in df.iterrows():

    data["owner"] = np.where(data["path"].str.contains(df_ref["partial_path"]), 
        df_ref["owner"], "unknown")

我正在寻找一种避免循环访问任何数据帧的方法。

1 个答案:

答案 0 :(得分:1)

尝试使用.apply

>>> df['owner'] = df['path'].apply(lambda path: df_ref.loc[df_ref['path'].str.contains(path), 'owner'].iloc[0])

输出:

>>> df
            path  filesize                         ctime owner
0   /pathA/stuff     171.0  Tue Dec 17 01:50:17 CET 2013   foo
1  /pathB/stuff2     162.0  Tue Dec 17 01:50:17 CET 2013   bar
2  /pathA/stuff2     156.0  Tue Dec 17 01:50:17 CET 2013   baz