有没有办法在Pandas中自定义清理一行?

我是 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']但我确信有最佳实践。

能否请你帮忙?提前致谢。

回答

您可以创建一个有趣的正则表达式模式以及.str.extract像这样提取您想要的信息:

df = pd.DataFrame(db1)
new_df = df["title"].str.extract(r"(?P<index>d+)s(?P<title>.*)s(?P<dimension>d+xd+)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<index>d+)捕获字符串开头的数字。我们将把它存储在一个名为“index”的捕获组中
  • s, 在数字之后找到一个空格字符。我们不想对这个角色做任何事情,所以它不会在一个捕获组中。
  • (?P<title>.*) 接下来查找所有字符,直到我们遇到下一个模式:
  • s(?P<dimension>d+xd+)这里的模式是任意数量的数字,后跟一个“x”,然后是更多的数字。我们将此字符串存储到称为维度的捕获组中。该字符串还必须以我们需要出现但最终忽略的空格开头。
  • s 在我们找到维度之后,我们期待另一个我们不做任何处理的空白字符。
  • (?P<year>d+),我们的最后一个捕获组“year”只是在我们的模式末尾找到最后一个数字。
  • .w+: 我们模式的结尾是一个句号“.” 后跟字母和/或数字的任意组合 - 这是为了匹配“.jpg”,但也将匹配任何其他文件后缀。

以上是有没有办法在Pandas中自定义清理一行?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>