我正在尝试使用re.search函数从数据框中的列中提取数字以查找数字字符,然后从"14 mins 16 secs"
转换为856
(秒)。我希望将re.search
的输出存储在新列中。
这是当前数据帧的子集。我要更改的列名为'Time taken'
:
我正在尝试使用re.search
,目前它以秒为单位输出转换后的分钟数,但我无法将输出存储在新列中...
MS_REGEX = re.compile('^(\d+)\smins\s(\d+)\ssecs$')
M_REGEX = re.compile('^(\d+)\smins$')
MSEC_REGEX = re.compile('^(\d+)\smins\s(\d+)\ssec$')
def total_seconds(time_col):
found = MS_REGEX.search(time_col)
if found:
return 60 * int(found.group(1)) + int(found.group(2))
found = M_REGEX.search(time_col)
if found:
return 60 * int(found.group(1))
found = MSEC_REGEX.search(time_col)
if found:
return 60 * int(found.group(1)) + int(found.group(2))
for elements in df['Time taken']:
print(total_seconds(elements))
我的输出将new_column显示为NaN值...
我想要的是这样的:
答案 0 :(得分:2)
Pandas已经具有一种内置方法,可以将一系列字符串解析为一系列timedelta对象pandas.to_timedelta
。
但是,要使其正常工作,首先需要稍微更改字符串,以便自动解析器起作用。需要将"mins"
替换为"min"
,将"secs"
和"sec"
替换为"s"
:
import pandas as pd
df = pd.DataFrame({"Time taken": ["14 mins 16 secs", "17 mins 54 secs", "18 mins", "18 mins 1 sec"]})
df["Time taken"] = df["Time taken"].str.replace("mins", "min").str.replace("secs|sec", "s")
df["time"] = pd.to_timedelta(df["Time taken"]).dt.total_seconds()
df
# Time taken time
# 0 14 min 16 s 856.0
# 1 17 min 54 s 1074.0
# 2 18 min 1080.0
# 3 18 min 1 s 1081.0
答案 1 :(得分:0)
一种可能的选择是提取个数字序列到 临时DataFrame:
tm = df['Time taken'].str.extract('(?P<mins>\d+)\D+(?P<secs>\d+)?')\
.fillna(0).astype('int')
请注意,列名取自捕获组名。
菲尔纳需要将丢失的秒数的NaN
值更改为零。
最后,需要 astype 来覆盖 object 的默认类型
(提取的序列是字符串)。
然后,您可以使用数字公式设置time
列:
df['time'] = tm.mins * 60 + tm.secs
最后,您应该使用del tm
删除临时DataFrame。
我的解决方案的优点是Time taken
列未更改。