Поиск значений в списке с помощью цикла for и печать результата поиска

#python #pandas

#python #pandas

Вопрос:

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

 def find_all(name, path):
   result = []
   for root, dirs, files in os.walk(path):
      if name in files:
         result.append(os.path.join(root, name))
   print(result)
find_all(name, "path_here")
  

Затем у меня есть список имен документов в Excel, которые я хочу найти в папке.

 d = {'doc_id': [123456, 289456, 654987, 128984, 980524]}
df = pd.DataFrame(data=d)

  

Я хочу использовать a for loop для перебора каждого doc_id и сделать его name переменной в find_all функции.

 for doc in df:
   name = doc
  

Я не уверен, как соединить эти два вместе и распечатать результат в новом столбце рядом с каждым doc_id.
Таким образом, результат, возможно, будет выглядеть

 df
doc_id     result
123456      n/a
289456     "folder named here that doc was found in"
654987      n/a
128984     "folder named here that doc was found in"
980524     "folder named here that doc was found in"
  

Комментарии:

1. for doc in df['doc_id'] будет работать в вашем случае.

2. Если ваша функция ничего не return выдает, то вы либо получите столбец None , либо вам придется выполнить какую-нибудь необычную вещь, например, преобразовать результат print() инструкции в строку, а затем присвоить строку фрейму данных. Кроме того, перебор значений фрейма данных почти никогда не является лучшим вариантом в pandas, изучите использование apply() для применения функции к фрейму данных

Ответ №1:

Это должно сработать:

 l=[i for i in os.walk('your_main_path_here')]

def path_of_file(file):
    for i in l:
        if file in i[2]:
            return i[0]
    return 'n/a'

df['result']=''
for i in range(len(df)):
    df.result.iloc[i]=path_of_file(df.doc_id.iloc[i])
  

В качестве альтернативы новый столбец может быть заполнен этими 2 способами (рекомендуется, если фрейм данных слишком длинный):

с помощью apply:

 df['result']=df['doc_id'].apply(lambda x: path_of_file(x))
  

С помощью map:

 df['result']=[i for i in map(path_of_file, df['doc_id'])]
  

Комментарии:

1. df['result'] И for loop входят внутрь name_path функции?

2. Дайте мне минуту, я вернусь с полным решением. Можете ли вы подтвердить, что все, что вам нужно, это второй столбец с путем к файлу для каждого файла в первом столбце, независимо от того, как это будет достигнуто?

3. да, это все.

4. Из любопытства, почему вы используете for i in range(len(df)): with iloc вместо встроенного метода apply() для применения функции к фрейму данных?

5. Да, я также добавил эту опцию, а также опцию map, на случай, если df слишком длинный