Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 将excel文件名转换为数据框列_Python 3.x_Regex_Pandas - Fatal编程技术网

Python 3.x 将excel文件名转换为数据框列

Python 3.x 将excel文件名转换为数据框列,python-3.x,regex,pandas,Python 3.x,Regex,Pandas,我有大约1500个excel文件,它们的格式类似。我需要清理和准备数据,以便将其纳入可视化工具。大部分清洁工作都很简单,我已经做好了。我现在正在处理一个文件,一旦完成,我将遍历所有文件 import pandas as pd import os userhome = os.path.expanduser('~/') path_to_file = userhome + 'Downloads/arunachal-pradesh/' file_name = 'Maker Month Wise Dat

我有大约1500个excel文件,它们的格式类似。我需要清理和准备数据,以便将其纳入可视化工具。大部分清洁工作都很简单,我已经做好了。我现在正在处理一个文件,一旦完成,我将遍历所有文件

import pandas as pd
import os

userhome = os.path.expanduser('~/')
path_to_file = userhome + 'Downloads/arunachal-pradesh/'
file_name = 'Maker Month Wise Data  of WEST KAMENG - AR4 , Arunachal Pradesh (2020).xlsx'

df = pd.read_excel(path_to_file + file_name)
df.columns = df.iloc[2]
df = df.drop(df.index[0:3])
df = df.iloc[:,1:14]
df.rename(columns={df.columns[0]: "Maker"}, inplace = True)
df.head(30)
这将输出如下所示的数据帧:

现在我的挑战是,我需要使用文件名来提取3个数据点——RTO、state和year,并将它们作为三个独立的列添加到数据框中。这是我拥有的文件的简短示例:

Maker Month Wise Data  of WEST KAMENG - AR4 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of UPPER SIANG - AR14 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of TIRAP - AR13 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of CHANGLANG - AR12 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of UPPER SUBANSIRI - AR7 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of KURUNG KUMEY - AR15 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of ITANAGAR CAPITAL COMPLEX - AR1 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of TAWANG - AR3 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of LOWER DIBANG VALLEY - AR16 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of LOWER SUBANSIRI - AR6 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of KAMLE - AR23 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of YUPIA - AR2 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of EAST SIANG - AR9 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of EAST KAMENG - AR5 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of LOHIT - AR11 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of NAMSAI - AR20 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of SHI-YOMI - AR26 , Arunachal Pradesh (2020).xlsx
Maker Month Wise Data  of WEST SIANG - AR8 , Arunachal Pradesh (2020).xlsx
如您所见,它们的格式类似。RTO是介于“of”和逗号之间的所有内容。因此,对于第一个文件,RTO将是
WEST-KAMENG-AR4
。这些文件的状态为
Arunachal Pradesh
,但它将在完整的文件列表中更改。这一年是
2020

我一直在尝试使用regex101来捕获这些参数,但我对regex不太在行,也没有找到正确的语法

任何帮助完成这项工作的人都将不胜感激

您可以使用

df[['RTO','State','Year']=df['Maker'].str.extract(r'\s+of\s(.*?\s*,\s*(.*?\s*\)(\d{4})\),expand=True)
看。详情:

  • \s+
    -一个或多个空格
  • 的一个词
  • \s+
    一个或多个空格
  • (.*)
    -第1组:除换行符以外的任何零个或多个字符,尽可能少
  • \s*,\s*
    -用0+空格括起来的逗号
  • (.*)
    -第2组:除换行符以外的任何零个或多个字符,尽可能少
  • \s*
    -0+空格
  • \(
    -a
    字符
  • (\d{4})
    -第3组:四位数字
  • \)
    -a
    字符

如果您说“我一直在尝试使用regex101捕获这些参数”,请显示您尝试的模式,并解释结果中的错误。例如,我正在尝试使用
RTO=re.search('\s\sof\s(.*\s\,','文件名)
隔离RTO,并且我将
作为输出。如果您需要字符串值,请使用
print(rto.group())
print(rto.group(1))
您的正则表达式。尝试
df[['RTO','State','Year']=df['Maker'].str.extract(r'\s+of\s(.*?\s*,\s*(.*?\s*)\((\d{4})\),expand=True)
。看,这就解决了,谢谢!哇,太简洁了!我写了6行代码,谢谢分享:)