![](/img/trans.png)
[英]How to use pandas.DataFrame.apply with getattr function in Python
[英]Python: how to apply a function with condition on a pandas dataframe?
我有一個 pandas dataframe 如下所示:
df
time case1 case2 case3
0 5 house bank atm
1 3 bank house pharmacy
2 10 bank bank atm
3 20 house pharmacy house
我想將基於時間和案例的概率與每個案例相關聯。 這里我們有每個類別的平均值和標准差。 因此,例如對於p_house
,如果time
在20-10=10
和20+10=30
之間,我們的概率為1
。
p_house = [20, 10]
p_bank = [5, 1]
p_atm = [3, 1]
p_pharmacy = [10, 5]
我想應用一個 function 來表示如果在每個案例 p=1 或 p=0 的范圍之間。 我想像這樣申請一個 function
def assignP(df):
if ((df.time < p.case1 + mu.case) and (df.time > p.case1-mu.case)):
df.time1 = 1
else:
df.time1 = 0
if ((df.time < p.case2 + mu.case) and (df.time > p.case2-mu.case)):
df.time2 = 1
else:
df.time2 = 0
if ((df.time < p.case3 + mu.case) and (df.time > p.case3-mu.case)):
df.time3 = 1
else:
df.time3 = 0
return df
我想要一個如下所示的 dataframe
df
time case1 case2 case3 p1 p2 p3
0 5 house bank atm 0 1 0
1 3 bank house pharmacy 0 0 0
2 10 bank bank atm 0 0 0
3 15 house pharmacy house 1 1 1
我相信你應該為不同的列寫一個 function 。 使用apply
您可以在行或列上運行簡單的 function。 在該 function 中,我將根據平均值/偏差確定 output 值。 也許下面可以給你一個開始:
from io import StringIO
# Create DataFrame
csvstring = StringIO("""
time case1 case2 case3
0 5 house bank atm
1 3 bank house pharmacy
2 10 bank bank atm
3 20 house pharmacy house
""")
df = pd.read_csv(csvstring, sep=" ")
p_house = [20, 10]
def get_phouse(col):
# Split the p_house value
(a, b) = p_house
# If column value between the 20 - 10 or 20 + 10, return 1, otherwise 0
return 1 if a-b < col < a+b else 0
df['phouse'] = df['time'].apply(get_phouse)
# time case1 case2 case3 phouse
# 0 5 house bank atm 0
# 1 3 bank house pharmacy 0
# 2 10 bank bank atm 0
# 3 20 house pharmacy house 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.