【发布时间】:2021-08-30 22:13:17
【问题描述】:
我有这个包含美国总统数据的 csv 文件。我被困在我有一个专栏 (Age atstart of presidency) 的地方,该专栏将总统任期开始时的年龄和总统任期开始的日期串联在一起。所以我想出了一个将它们分开的正则表达式,并且我可以工作(在 regex101 上测试)并且在使用单个系列对象进行测试时,但是当我将它传递给整个数据框时它似乎不起作用。
简而言之,我有一个名为Age atstart of presidency 的列,其中包含57 years, 67 daysApr 30, 1789 之类的数据,我的工作是区分年龄和日期。
即-
age date
57 years, 67 days Apr 30, 1789
但问题是正则表达式不适用于整个数据框,但在我传递单个系列对象时有效(我觉得这很奇怪,因为当我指定像 df['cName'] 这样的列时,我在技术上进行操作在底层 Series 对象上。我说的对吗?)
这里是代码-
import pandas as pd
df = pd.read_csv("datasets/presidents.csv")
pattern = r"(?P<age>.+ days)(?P<start>.+ \w{4})"
s = pd.Series({'date' : '57 years, 67 daysApr 30, 1789'})
print(s.str.extract(pattern)) #this works
print('--'*10)
print(df['Age atstart of presidency'].str.extract(pattern).head()) #doesn't work
输出 -
age start
date 57 years, 67 days Apr 30, 1789
----------------------
age start
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
如果有人需要我正在处理的数据集 - https://file.re/2021/06/14/presidents/
【问题讨论】:
-
为我工作。如果您仍然有问题,请确保创建一个可重现的示例。
-
嘿,如何为您工作?导入我链接的 csv 文件时在数据框上?或在单个系列对象
s?? -
两者都对我有用 - 我从您提供的链接中复制了 csv 文件
-
也为我工作。万一出现问题,请尝试
df = pd.DataFrame({'date' : ['57 years, 67 daysApr 30, 1789']})df=df.assign(Age=df['date'].str.split('days').str[0]+'days', startdate=df['date'].str.split('days').str[1]) -
@Psidom 这怎么可能?我在两台机器上试过,总是得到
nan。
标签: python regex pandas dataframe csv