我df在籃球比賽中有一個時間戳(這是一個示例。我的實際 df 要大得多)
year period p_sec_rem
0 2015 1 556
1 2013 1 455
2 2001 2 67
3 2008 3 177
4 2017 1 172
period是比賽的時間,是比賽p_sec_remaining中剩余的秒數period。我想計算自游戲開始以來已經過去了多少秒(time)并有一些邏輯可以做到這一點。這有點復雜,但解釋它不是重點,因為我確信它是正確的:
df['time'] = None
def secondsPlayed(df):
if df.year >= 2006:
if df.period == 1:
df['time'] = 600 - df.p_sec_rem
elif df.period > 1 & df.period < 5:
df['time'] = ((df.period * 10) * 60) - df.p_sec_rem
elif df.period == 5:
df['time'] = (((4 * 10) * 60) 300) - df.p_sec_rem
elif df.period == 6:
df['time'] = (((4 * 10) * 60) 600) - df.p_sec_rem
elif df.period == 7:
df['time'] = (((4 * 10) * 60) 900) - df.p_sec_rem
elif df.year <= 2005:
if df.period == 1:
df['time'] = 1200 - df.p_sec_rem
elif df.period == 2:
df['time'] = 2400 - df.p_sec_rem
elif df.period == 3:
df['time'] = (((2 * 20) * 60) 300) - df.p_sec_rem
elif df.period == 4:
df['time'] = (((2 * 20) * 60) 600) - df.p_sec_rem
elif df.period == 5:
df['time'] = (((2 * 20) * 60) 900) - df.p_sec_rem
elif df.period == 6:
df['time'] = (((2 * 20) * 60) 1200) - df.p_sec_rem
elif df.period == 7:
df['time'] = (((2 * 20) * 60) 1500) - df.p_sec_rem
我想將此邏輯應用于 my 的每一行df,所以我認為 using*.apply()可以解決問題,但是唉:
df.apply(secondsPlayed,axis=1)
0 None
1 None
2 None
3 None
4 None
當我None想要的輸出是:
0 44
1 145
2 2333
3 1623
4 428
我遇到了這個問題,但我認為它與我的示例略有不同,因為我需要將整個 df 傳遞給函式,因為我使用多個不同的列來確定輸出df.time值的條件。我懷疑我很接近,但已經玩了一段時間無濟于事。
uj5u.com熱心網友回復:
你只需要df在你的函式中回傳:
def secondsPlayed(df):
if df.year >= 2006:
if df.period == 1:
df['time'] = 600 - df.p_sec_rem
elif df.period > 1 & df.period < 5:
df['time'] = ((df.period * 10) * 60) - df.p_sec_rem
elif df.period == 5:
df['time'] = (((4 * 10) * 60) 300) - df.p_sec_rem
elif df.period == 6:
df['time'] = (((4 * 10) * 60) 600) - df.p_sec_rem
elif df.period == 7:
df['time'] = (((4 * 10) * 60) 900) - df.p_sec_rem
elif df.year <= 2005:
if df.period == 1:
df['time'] = 1200 - df.p_sec_rem
elif df.period == 2:
df['time'] = 2400 - df.p_sec_rem
elif df.period == 3:
df['time'] = (((2 * 20) * 60) 300) - df.p_sec_rem
elif df.period == 4:
df['time'] = (((2 * 20) * 60) 600) - df.p_sec_rem
elif df.period == 5:
df['time'] = (((2 * 20) * 60) 900) - df.p_sec_rem
elif df.period == 6:
df['time'] = (((2 * 20) * 60) 1200) - df.p_sec_rem
elif df.period == 7:
df['time'] = (((2 * 20) * 60) 1500) - df.p_sec_rem
return df
輸出:
year period p_sec_rem time
0 2015 1 556 44
1 2013 1 455 145
2 2001 2 67 2333
3 2008 3 177 1623
4 2017 1 172 428
uj5u.com熱心網友回復:
由于您似乎想使用此功能apply,所以我將回答這部分。
您的函式應該將一行作為輸入和return一個值,目前它沒有:
def secondsPlayed(row):
if row.year >= 2006:
if row.period == 1:
return 600 - row.p_sec_rem
elif row.period > 1 & row.period < 5:
return ((row.period * 10) * 60) - row.p_sec_rem
elif row.period == 5:
return (((4 * 10) * 60) 300) - row.p_sec_rem
elif row.period == 6:
return (((4 * 10) * 60) 600) - row.p_sec_rem
elif row.period == 7:
return (((4 * 10) * 60) 900) - row.p_sec_rem
elif row.year <= 2005:
if row.period == 1:
return 1200 - row.p_sec_rem
elif row.period == 2:
return 2400 - row.p_sec_rem
elif row.period == 3:
return (((2 * 20) * 60) 300) - row.p_sec_rem
elif row.period == 4:
return (((2 * 20) * 60) 600) - row.p_sec_rem
elif row.period == 5:
return (((2 * 20) * 60) 900) - row.p_sec_rem
elif row.period == 6:
return (((2 * 20) * 60) 1200) - row.p_sec_rem
elif row.period == 7:
return (((2 * 20) * 60) 1500) - row.p_sec_rem
然后使用:
df['time'] = df.apply(secondsPlayed, axis=1)
輸出:
year period p_sec_rem time
0 2015 1 556 44
1 2013 1 455 145
2 2001 2 67 2333
3 2008 3 177 1623
4 2017 1 172 428
uj5u.com熱心網友回復:
看來您可以使用矢量化操作而不是 apply on axis=1。這個想法是,在 2005 年之前,計算time取決于它是否是第一期。2006年以后,要看是否在第5期之前:
import numpy as np
df['time'] = (np.where(df['year']<=2005,
np.where(df['period']==1,
1200, 1800 300*df['period']),
np.where(df['period']<5,
df['period']*600, 1200 300*df['period']))
- df['p_sec_rem'])
輸出:
year period p_sec_rem time
0 2015 1 556 44
1 2013 1 455 145
2 2001 2 67 2333
3 2008 3 177 1623
4 2017 1 172 428
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455772.html
上一篇:用字典值替換pandas列值
下一篇:通過cols合并/連接兩個資料幀
