gpt4 book ai didi

python - Pandas:将一列分解为多行

转载 作者:行者123 更新时间:2023-12-02 18:46:46 24 4
gpt4 key购买 nike

需要一些帮助来根据 Pandas 中的正则表达式拆分字段并创建数据框。

<表类=“s-表”><标题>一个BC <正文>11292021 年 4 月 19 日邮政编码详细信息:城市:Huntsville_Alabama,邮政编码:35808,801thru816 城市:Anchorage_Alaska,邮政编码:99506,501thru52411392021 年 4 月 20 日邮政编码详细信息:城市:Miami_Florida,邮政编码:33128、124thru190 城市:Atlanta_Georgia、邮政编码:30301、301thru381

在 C 列之一中,需要提取多个城市和邮政编码详细信息并在以下格式:

<表类=“s-表”><标题>否日期城市邮政编码 <正文>11292021 年 4 月 19 日阿拉巴马州亨茨维尔3580811292021 年 4 月 19 日阿拉斯加安克雷奇9950611392021 年 4 月 20 日佛罗里达州迈阿密3312811392021 年 4 月 20 日佐治亚州亚特兰大30301

我的 re.findall 表达式如下并且工作正常:

city_regex_extract = r" [a-z|A-Z|0-9|_]*\_[a-z|A-Z|0-9|_]*"    (https://regex101.com/r/VM8oFF/1)
zip_regex_extract = r"[0-9]{5}" (https://regex101.com/r/oBYJZX/1)

下面是到目前为止的代码,但是无法将 Zip 字段添加到其中。

import pandas as pd
import json, re, sys, time


df = pd.DataFrame({
'No': ['1129', '1139'],
'Date': ['19-APR-2021','20-APR-2021'],
'C': ['Zip Code Details: City: Huntsville_Alabama , Zip: 35808 , 801thru816 City: Anchorage_Alaska , Zip: 99506 , 501thru524','Zip Code Details: City: Miami_Florida , Zip: 33128 , 124thru190 City: Atlanta_Georgia , Zip: 30301 , 301thru381']
})


city_regex_extract = r" [a-z|A-Z|0-9|_]*\_[a-z|A-Z|0-9|_]*"
zip_regex_extract = r"[0-9]{17}"


df['City'] = [re.findall(city_regex_extract, str(x)) for x in df['C']]
df['Zip'] = [re.findall(zip_regex_extract, str(x)) for x in df['C']]

df = (df
.set_index(['No','Date'])['City']
.apply(pd.Series)
.stack()
.reset_index()
.drop('level_2', axis=1)
.rename(columns={0:'City'}))

print(df)

感谢任何帮助。

最佳答案

Series.str.extractall

s = df['C'].str.extractall(r'City:\s*(?P<City>[^,]+?)\s*,\s*Zip:\s*(?P<Zip>\d+)')
df[['No', 'Date']].join(s.droplevel(1))

     No         Date                City    Zip
0 1129 19-APR-2021 Huntsville_Alabama 35808
0 1129 19-APR-2021 Anchorage_Alaska 99506
1 1139 20-APR-2021 Miami_Florida 33128
1 1139 20-APR-2021 Atlanta_Georgia 30301

正则表达式详细信息:

  • City: :匹配字符City:从字面上看
  • \s* :匹配零个或多个空白字符
  • (?P<City>[^,]+?) :第一个命名的捕获组
    • [^,]+? :匹配除 , 之外的任何字符一次或多次,但次数越少越好
  • \s*,\s* :匹配零个或多个空格,后跟逗号,后跟零个或多个空格
  • Zip: :匹配字符Zip:从字面上看
  • \s* :匹配零个或多个空白字符
  • (?P<Zip>\d+) :第二个命名捕获组
    • \d+ :匹配一个数字一次或多次

查看在线 regex demo

关于python - Pandas:将一列分解为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67335184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com