【问题标题】:Is there a way to custom clean a row in Pandas?有没有办法在 Pandas 中自定义清理一行?
【发布时间】:2021-06-21 16:44:00
【问题描述】:

我是 Pandas 的新手,我正在尝试使用它来清理由索引、艺术作品标题和艺术作品维度组成的数据库。

我拥有的是:

db1 = {'title' : ['121 art1 magic world 100x82 2000.jpg', '383 art2 fantastic comic 61x61 2017.jpg']}

我需要的是

db2 = {'index': [121,383],
       'title' : ['art1 magic world', 'art2 fantastic comic'],
       'dimension': ['100x82','61x61']
       'year': [2000, 2017]

我没有成功的尝试:

  • str.split(expand=True) 方法,在 df = pd.DataFrame(dict) 上,但我对标题由许多单词组成的事实感到困惑。

  • .replace() 清理 df['title'] 的方法,但我确信这是一个最佳实践。

你能帮忙吗? 提前致谢。

【问题讨论】:

  • 是否总是有 2 件事要索引或任何数字?对于这项工作,我认为使用 pandas 没有任何优势。简单的 python 列表和字典应该可以。

标签: python regex pandas


【解决方案1】:

您可以创建一个有趣的正则表达式模式以及.str.extract 来提取您想要的信息,如下所示:

df = pd.DataFrame(db1)
new_df = df["title"].str.extract(r"(?P<index>\d+)\s(?P<title>.*)\s(?P<dimension>\d+x\d+)\s(?P<year>\d+)\.\w+")

print(new_df)
  index                 title dimension  year
0   121      art1 magic world    100x82  2000
1   383  art2 fantastic comic     61x61  2017

正则表达式模式的工作原理如下:

  • (?P&lt;index&gt;\d+) 捕获字符串开头的数字。我们会将其存储在名为“index”的捕获组中
  • \s,在数字后找到一个空白字符。我们不想对这个角色做任何事情,所以它不会在捕获组中。
  • (?P&lt;title&gt;.*) 接下来查找所有字符,直到遇到下一个模式:
  • \s(?P&lt;dimension&gt;\d+x\d+) 这里的模式是任意数量的数字,后跟一个“x”,然后是更多数字。我们将此字符串存储到称为维度的捕获组中。此字符串还必须以我们需要存在但最终忽略的空格开头。
  • \s 找到维度后,我们期待另一个空白字符,我们不做任何事情。
  • (?P&lt;year&gt;\d+),我们最后一个捕获组“year”只是在我们模式的末尾找到最后一个数字。
  • \.\w+:我们模式的结尾是句号“。”后跟字母和/或数字的任意组合 - 这是为了匹配“.jpg”,但也将匹配任何其他文件后缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2019-11-28
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多