#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)):
withiloc
вместо встроенного методаapply()
для применения функции к фрейму данных?5. Да, я также добавил эту опцию, а также опцию map, на случай, если df слишком длинный