[英]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.