#python #pandas #for-loop #mkdir
#python #pandas #для цикла #mkdir
Вопрос:
У меня есть фрейм данных, подобный этому:
mgr1 mgr2 mgr3
abc def fed
asd dij
sdf
df действительно содержит нули
Я пытаюсь создать каталог, в котором уникальное mgr3
значение (ы) — это имя папки верхнего уровня, mgr2
уникальные значения — это подпапки, mgr1
уникальные значения — это папки во второй подпапке и т.д. А затем добавьте только один текстовый файл в каждую папку.
Я пошел по пути превращения каждого столбца в переменную с уникальными строками, а затем попытался выполнить некоторый цикл for, который создает папку на основе этих строк, но у меня не получилось.
#someting like this
mgr1 = list(set(df.mgr1))
mgr1 = [x for x in mgr1 if str(x) != 'nan']
mgr1 = ''.join(mgr1)
# print(mgr1)
for i in mgr1:
os.system ("mkdir " i)
for j in range (1):
os.system ("touch " str(i) "/" str(j) ".txt")
есть идеи?
Попытка 1:
import os
import sys
import pandas as pd
import itertools
df = pd.read_csv('sas-user-mappings-to-ceo.csv')
eight = df.loc[~df['mgr8'].isnull(), 'mgr8'].tolist()
seven = df.loc[~df['mgr7'].isnull(), 'mgr7'].tolist()
six = df.loc[~df['mgr6'].isnull(), 'mgr6'].tolist()
five = df.loc[~df['mgr5'].isnull(), 'mgr5'].tolist()
four = df.loc[~df['mgr4'].isnull(), 'mgr4'].tolist()
three = df.loc[~df['mgr3'].isnull(), 'mgr3'].tolist()
two = df.loc[~df['mgr2'].isnull(), 'mgr2'].tolist()
one = df.loc[~df['mgr1'].isnull(), 'mgr1'].tolist()
user_name = df.loc[~df['user_name'].isnull(), 'user_name'].tolist()
# third = df.loc[~df['user_lid'].isnull(), 'user_lid'].tolist()
paths = [list(x) for x in itertools.product(eight, seven, six, five, four, three, two, one, user_name)]
for pathToWrite in paths:
pathToWrite = "UsersmaxDownloadsusers_visual"
toCreate = os.path.join("C:", pathToWrite)
os.mkdir(toCreate)
error: SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated UXXXXXXXX escape
Ответ №1:
import itertools
base = df.loc[~df['mgr3'].isnull(), 'mgr3'].tolist()
sec = df.loc[~df['mgr2'].isnull(), 'mgr2'].tolist()
third = df.loc[~df['mgr1'].isnull(), 'mgr1'].tolist()
paths = [list(x) for x in itertools.product(base, sec, third)]
for pathToWrite in paths:
#change the path to where ever you need to
toCreate = os.path.join("C:", *pathToWrite)
os.mkdir(toCreate)
Получите все пути в отдельных списках. Поскольку я не знал, были ли упорядочены ваши столбцы, я просто сделал это в отдельных строках. Используйте itertools для создания всех путей, затем просмотрите список путей и создайте его.
Комментарии:
1. я только что добавил свою попытку к сообщению. Не уверен, что я делаю не так?!
2. Попробуйте изменить
df = pd.read_csv('sas-user-mappings-to-ceo.csv')
наdf = pd.read_csv('sas-user-mappings-to-ceo.csv', encoding = 'utf-8')
Его проблему с чтением фактического csv. Если это не сработает, вам придется попробовать другую кодировку.3. Также убедитесь, что вы не перезаписываете ‘pathToWrite’ в цикле for при создании всех каталогов.
4. хорошо, хороший вызов. я добавил latin1, а затем set() вокруг каждого из списков. они должны быть уникальными списками. но когда я запускаю строку путей — я получаю сообщение об ошибке:
MemoryError
. I форма df равна 1219, 10. это слишком большой?5. если вы хотели, чтобы они были уникальными, измените
tolist()
на.unique().tolist()
, не меняйте его на set.