簡體   English   中英

如何從re.search輸出中向數據框添加新列?

[英]How to add a new column to a dataframe from re.search output?

我正在嘗試使用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值...

輸出量

我想要的是這樣的: 期望的輸出

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

一種可能的選擇是將數字序列提取到臨時DataFrame中:

tm = df['Time taken'].str.extract('(?P<mins>\d+)\D+(?P<secs>\d+)?')\
    .fillna(0).astype('int')

請注意,列名取自捕獲組名。

Fillna需要將丟失的秒的NaN值更改為零。 最后,需要astype來覆蓋對象的默認類型(提取的序列為字符串)。

然后,您可以使用數字公式設置time列:

df['time'] = tm.mins * 60 + tm.secs

最后,您應該使用del tm刪除臨時DataFrame。

我的解決方案的優點是Time taken列未更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM