我的熊貓資料框中有一列字串值,稱為“travel_time”,其值如下:
1 hour 10 mins
34 mins
58 mins
1 hour 32 mins
12 mins
我想創建一個新列,將這些字串轉換為分鐘(整數),以便我可以進行計算(平均值、最小值、最大值、分箱等)。例如,“1 小時 10 分鐘”變為 70、“34 分鐘” '變成34,'58分鐘'變成58,'1小時32分鐘'變成92,'12分鐘'變成12
我知道 python 中有一些函式可以讓我從字串中洗掉非數值,但我不確定如何處理 travel_time 大于 60 分鐘的情況。關于我如何做到這一點的任何建議?
uj5u.com熱心網友回復:
您可以使用df.applymap在資料框上應用自定義函式。
import pandas as pd
df = pd.DataFrame(['1 hour 10 mins', '34 mins', '58 mins', '1 hour 32 mins', '12 mins'])
timemap = {'mins': 1, 'hour': 60} # Express time units in minutes. Add as needed.
def transform(s):
n = 0
count = {}
# Split string by space and parse tokens.
for tok in s.split():
if tok in timemap: # Token is a time unit.
count[tok] = n
else:
try: # Token is an integer?
n = int(tok)
except ValueError: # Nope, not an integer. :(
raise RuntimeError(f'unknown token: {tok}')
# Add total.
return sum(timemap[t] * val for t, val in count.items())
print(df.applymap(transform))
輸出:
0
0 70
1 34
2 58
3 92
4 12
如果要將函式應用于特定列,請使用df['the_column'].apply(transform).
uj5u.com熱心網友回復:
這是我們使用正則運算式的另一個答案。但與 TrebledJ 的回答相比,它的效率會降低:
import pandas as pd
import re
df = pd.DataFrame({
'travel_time': [
'1 hour 10 mins',
'34 mins',
'58 mins',
'1 hour 32 mins',
'12 mins'
]
})
def timeCleanup(time_value):
hours = '0'
minutes = '0'
# parse hours
match = re.search(r'\d \s*h', time_value)
if match:
hours = re.search(r'\d ', match.group()).group()
# parse minutes
match = re.search(r'\d \s*m', time_value)
if match:
minutes = re.search(r'\d ', match.group()).group()
# returns hours * 60 minutes
return int(hours) * 60 int(minutes)
df = df['travel_time'].apply(lambda x: timeCleanup(x))
print(df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/515199.html
上一篇:獲取兩個平面陣列之間的差異并與一個陣列中的重復值合并
下一篇:大PHP陣列到可讀的json
