【问题标题】:Converting excel file names to pandas data frame columns将 excel 文件名转换为 pandas 数据框列
【发布时间】:2021-05-26 16:04:28
【问题描述】:

我有大约 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、州和年份,并将它们添加为数据框中的三个单独的列。这是我拥有的文件的简短示例:

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 不太擅长,并且无法找出正确的语法。

我们将不胜感激!

【问题讨论】:

  • 您说“我一直在尝试使用 regex101 来捕获这些参数”,请显示您尝试的模式并解释结果有什么问题。
  • 例如,我现在正尝试使用rto = re.search('\s\sof\s(.*)\s\,', filename) 隔离RTO,我得到<re.Match object; span=(21, 44), match=' of CHANGLANG - AR12 ,'> 作为输出。不知道我做错了什么
  • 如果需要字符串值,使用print(rto.group())print(rto.group(1))
  • 你的正则表达式looks quite fine。试试df[['RTO','State','Year']] = df['Maker'].str.extract(r'\s+of\s(.*?)\s*,\s*(.*?)\s*\((\d{4})\)', expand=True)。见the regex demo
  • 解决了,谢谢!

标签: python-3.x regex pandas


【解决方案1】:

你可以使用

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

请参阅regex demo详情

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

【讨论】:

  • 哇,太简洁了!我用 6 行代码编写了相同的代码,哈哈。谢谢你分享这个:)
猜你喜欢
  • 2020-06-21
  • 2012-09-16
  • 2018-03-25
  • 2019-09-25
  • 2020-02-29
  • 2022-01-10
  • 2013-01-08
  • 1970-01-01
  • 2017-06-22
相关资源
最近更新 更多