Давайте попробуем создать mcve first
import os
import random
import pandas as pd
# this create an empty file
def touch(path):
with open(path, 'a'):
os.utime(path, None)
fldr = "main_folder"
for i in range(10):
new_fldr = os.path.join(fldr, f"school{i:03d}")
os.makedirs(new_fldr, exist_ok=True)
for k in range(5):
fn = random.randint(1,10)
fn = os.path.join(new_fldr, f"m{fn}.pdf")
touch(fn)
Теперь у нас есть 10 папок с (до) 5 файлами со случайными именами в каждой. Затем мы хотим прочитать все файлы, вложенные в main folder
def recursive_get_files(path):
out = []
for (dirpath, dirnames, filenames) in os.walk(path):
if len(filenames) > 0:
out += [os.path.join(dirpath, fn)
for fn in filenames]
return out
out = recursive_get_files(fldr)
# we put these filenames on a df
df = pd.DataFrame({"fn":out})
# split rname and remove the first one
df["fn"] = df["fn"].str.split("/").str[1:]
# expand list to columns
df = pd.DataFrame(df['fn'].values.tolist(), columns=['fldr','fn'])
# These are existing files
df["exist"] = True
# Use pivot_table
pv = pd.pivot_table(df,
index="fldr",
columns="fn",
values="exist")\
.fillna(False)
EDIT , учитывая, что расширение списка до столбцов не работает, вы можете попробовать эти альтернативы
Альтернатива 1
df = df["fn"].apply(pd.Series)
df.columns = ['fldr','fn']
Альтернатива 2
df["fldr"] = df["fn"].str[0]
df["fn"] = df["fn"].str[1]