Найдите только переменные числовые данные в имени файла в столбце pandas и поместите числа в новый столбец
Я использую этот код для извлечения двух CSV с аналогичным соглашением об именах, помещаю их имена в столбец "Файл" и объединяю фреймы данных в один фрейм данных, называемый NatHrs.
import glob
from pathlib import Path
path = r'C:\Users\ThisUser\Desktop\AC Mbr Analysis'
all_files = glob.glob(path + '\\Natl_hours_YTD_OC_*.csv')
Nat_dfs = []
for file in all_files:
df = pd.read_csv(file, index_col=None, encoding='windows-1252', header=1 )
df['File'] = file
Nat_dfs.append(df)
NatHrs = pd.concat(Nat_dfs)
Теперь я хочу взять столбец "Файл", который возвращает объект имени файла с записями вида "C:\Users\ThisUser\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2018-2019", извлекать ТОЛЬКО конец имени файла - в в данном случае "2018-2019"- и поместите эти символы в новый столбец "Год программы", отражающий запись "2018-2019". Мне не удается манипулировать строками или сериями - следует ли использовать path.replace? Я потерян. Когда я описываю столбец, который хочу проанализировать...
NatHrs['File'].describe
... я получаю это:
Name: File, dtype: object>
3 ответа
В конечном итоге это сработало. Большое спасибо за помощь мне!
globbed_files = glob.glob("Natl_hours_YTD_OC_*.csv")
globbed_files
data = []
for csv in globbed_files:
frame = pd.read_csv(csv, encoding='windows-1252', header=1)
frame['filename'] = os.path.basename(csv)
file = os.path.basename(csv)
#create a new column to store the portion of the file name that denotes the Program Year to which the data belongs
frame['Program Year'] = re.search('\d+[-]*\d*',file).group()
data.append(frame)
NatHrs = pd.concat(data, ignore_index=True) #dont want pandas to try an align row indexes
NatHrs.copy().head()
Вы можете использовать регулярные выражения для поиска подстрок в строке:
import re
string = r"C:\Users\ThisUser\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2018-2019"
short = string.split('\\')[-1]
substring = re.search('\d+[-]*\d+',short).group()
print(substring)
Возможно, вы захотите уточнить, как может варьироваться узор. Всегда ли это будет "Год-Год"? Может это просто "Год"? Тогда, возможно, придется изменить регулярное выражение.
РЕДАКТИРОВАТЬ:
Все это было довольно неудобно, поэтому я сделал свои собственные фиктивные файлы, с которыми я могу делать то, что вы хотите. У меня работает нормально, но посмотрите сами:
import glob
import pandas as pd
import re
import os
all_files = glob.glob('Natl_hours_YTD_OC_*.csv')
full_paths = [os.path.abspath(file) for file in all_files]
print(full_paths)
>>> Out:
['C:\\Users\\Chris\\Desktop\\Natl_hours_YTD_OC_2018-2019.csv',
'C:\\Users\\Chris\\Desktop\\Natl_hours_YTD_OC_2019-2020.csv',
'C:\\Users\\Chris\\Desktop\\Natl_hours_YTD_OC_2020.csv']
Nat_dfs = []
for file in all_files:
df = pd.read_csv(file,delim_whitespace=True)
print(df,'\n')
df['File'] = file
df['Year'] = re.search('\d+[-]*\d*',file).group()
Nat_dfs.append(df)
>>> Out:
A B
0 7 7
1 8 8
2 9 9
A B
0 4 4
1 5 5
2 6 6
A B
0 1 1
1 2 2
2 3 3
NatHrs = pd.concat(Nat_dfs)
print(NatHrs)
>>> Out:
A B File Year
0 7 7 Natl_hours_YTD_OC_2018-2019.csv 2018-2019
1 8 8 Natl_hours_YTD_OC_2018-2019.csv 2018-2019
2 9 9 Natl_hours_YTD_OC_2018-2019.csv 2018-2019
0 4 4 Natl_hours_YTD_OC_2019-2020.csv 2019-2020
1 5 5 Natl_hours_YTD_OC_2019-2020.csv 2019-2020
2 6 6 Natl_hours_YTD_OC_2019-2020.csv 2019-2020
0 1 1 Natl_hours_YTD_OC_2020.csv 2020
1 2 2 Natl_hours_YTD_OC_2020.csv 2020
2 3 3 Natl_hours_YTD_OC_2020.csv 2020
Я не знаю, что вы делаете не так, но это определенно работает. Надеюсь, это то, что вам нужно.
Я пробовал это:
import re
string = NatHrs['File']
short = string.split('\\')[-1]
substring = re.search('\d+[-]*\d+',short).group()
print(substring)
NatHrs['Program Year'] = substring
NatHrs
И я получил вот что:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-257-f8c37bb604e2> in <module>
3
4 string = NatHrs['File']
----> 5 short = string.split('\\')[-1]
6
7 substring = re.search('\d+[-]*\d+',short).group()
~\anaconda3\envs\PythonData\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
5177 if self._info_axis._can_hold_identifiers_and_holds_name(name):
5178 return self[name]
-> 5179 return object.__getattribute__(self, name)
5180
5181 def __setattr__(self, name, value):
AttributeError: 'Series' object has no attribute 'split'
Это вернуло файл, который считал этот тип несоответствия между годами файла и года программы:
File Program Year
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2018-2019.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2018-2019.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2018-2019.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2019-2020.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2019-2020.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2019-2020.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2019-2020.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2019-2020.csv 2018-2019
C:\Users\HHeatley\Desktop\AC Mbr Analysis\Natl_hours_YTD_OC_2019-2020.csv 2018-2019
Я тоже пробовал это:
import re
string = file
short = string.split('\\')[-1]
substring = re.search('\d+[-]*\d+',short).group()
print(substring)
NatHrs['Program Year'] = substring
NatHrs
И получил столбец "Программный год", отражающий только 2019-2020 годы, хотя я хочу, чтобы отображались и 2018-2019, и 2019-2020 годы.