Панды отображают фреймы данных с использованием частичных строк - PullRequest
0 голосов
/ 21 октября 2019

У меня есть два фрейма данных (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")

Я ищу подход, который позволил бы избежать циклического прохождения любого из фреймов данных.

1 Ответ

1 голос
/ 21 октября 2019

Попробуйте с .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...