Найдите только переменные числовые данные в имени файла в столбце 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 годы.

Другие вопросы по тегам