Я написал этот вопрос, посвященный пандам, поскольку он является более популярным модулем, чтобы понять аналогичный пример.
Я хочу добавить столбец и заполнить его частью каждого уникального адреса файлов в каталоге:
Пример: скажем, у меня есть два файла из каждой подпапки под именами: 45554
и 32456
Поэтому их пути:
C:\Users\user\Desktop\SHAPE\45554\INS\INS.shp
C:\Users\user\Desktop\SHAPE\45554\INB\INB.shp
C:\Users\user\Desktop\SHAPE\32456\INS\INS.shp
C:\Users\user\Desktop\SHAPE\32456\INB\INB.shp
поэтому мне нужно извлечь каждую позицию -3
и заполнить новый столбец.
Подобно:
new_col
45554
45554
32456
32456
etc..
Код:
import pandas as pd
import os
import glob
folder = path.Path(r"C:\Users\user\Desktop\SHAPE")
files = []
for fil in glob.iglob('**/Desktop/SHAPE/**/' ,recursive = True):
try:
files.append(pd.read_table(fil))
fil['col'] = shpfile.split("\\")[-3]
except ValueError as ex:
if not os.listdir(fil):
print(f'{fil} is empty')
df = pd.concat(files, sort=True))
df.to_csv(folder / 'all.csv')
Как можно достичь?
Вы можете использовать модуль os
для выполнения этой манипуляции. Преимущество использования этого модуля - правильный разделитель, который будет использоваться для вашей платформы.
import os
x = r'C:\Users\user\Desktop\SHAPE\45554\INS\INS.shp'
def get_folder(fp, k=5):
return os.path.split(fp)[0].split(os.sep)[k]
x_folder = get_folder(x) # '45554'
Затем просто примените в своей петле через pd.DataFrame.assign
:
for fil in glob.iglob('**/Desktop/SHAPE/**/' ,recursive = True):
files.append(pd.read_table(fil).assign(col=get_folder(fil)))
TypeError: 'str' object does not support item assignment
: TypeError: 'str' object does not support item assignment
Использование str.split
Пример:
import pandas as pd
df = pd.DataFrame({"Path": ['C:\\Users\\user\\Desktop\\SHAPE\\45554\\INS\\INS.shp', 'C:\\Users\\user\\Desktop\\SHAPE\\45554\\INB\\INB.shp', 'C:\\Users\\user\\Desktop\\SHAPE\\32456\\INS\\INS.shp', 'C:\\Users\\user\\Desktop\\SHAPE\\32456\\INB\\INB.shp']})
df['col'] = df["Path"].str.split(r"\\").str[-3]
print(df)
Выход:
Path col
0 C:\Users\user\Desktop\SHAPE\45554\INS\INS.shp 45554
1 C:\Users\user\Desktop\SHAPE\45554\INB\INB.shp 45554
2 C:\Users\user\Desktop\SHAPE\32456\INS\INS.shp 32456
3 C:\Users\user\Desktop\SHAPE\32456\INB\INB.shp 32456
TypeError: list indices must be integers or slices, not str