我有两个数据帧(df
,df_ref
),后者包含一个键和值,应映射到df
。
挑战在于,由于引用中包含的字符串与df
中包含的字符串仅部分重叠,因此我无法直接映射df_ref
和df
中的相应列。
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")
我正在寻找一种避免循环访问任何数据帧的方法。
答案 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