[英]Create complicated conditional column (geometric mean) Python
我正在嘗試在DF中創建一個列,該列將告訴我在給定時間的水是否具有可游泳的質量。 我用幾何平均值打牆。
這是我正在使用的迷你樣本df:
df = pd.DataFrame({'Site': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C'], 'EnteroCount': [1733, 4, 20, 150, 70, 1500, 55, 22, 180]})
df["Site"] = df["Site"].astype('category')
這些是使水不能游泳的條件:
EnteroCount> = 110
要么
五個或更多樣本的幾何平均值(加權平均值)大於30
我想創建一個僅基於這兩個條件分配一個值“可接受”或“不可接受”的列。 對於第一個條件,我可以執行以下操作,但是引入gmean並不是那么容易(或者是嗎?):
df['swim'] = np.where(df['EnteroCount']>=110, 'unacceptable', 'acceptable')
很想知道如何有效地做到這一點。
這將計算每個位置的幾何平均值,並檢查其是否大於30:
>>> df['geo_mean_acceptable'] = (
df.groupby('Site')
.transform(lambda group: group.prod() ** (1 / float(len(group))) > 30)
.astype(bool))
這得到每個站點的幾何平均值:
>>> df.groupby('Site').EnteroCount.apply(lambda group: group.product() ** (1 / float(len(group))))
Site
A 68.016702
B 121.981006
C 180.000000
Name: EnteroCount, dtype: float64
使用scipy中的幾何均值函數:
from scipy.stats.mstats import gmean
>>> df.groupby('Site').EnteroCount.apply(gmean)
Site
A 68.016702
B 121.981006
C 180.000000
Name: EnteroCount, dtype: float64
鑒於五個最高值將為您提供一組中最高的幾何平均值,您可以使用以下方法:
df.groupby('Site').EnteroCount.apply(lambda group: gmean(group.nlargest(5)))
您可以看到如何按組選擇最大的五個值,然后將其用作gmean
參數:
>>> df.groupby('Site').EnteroCount.apply(lambda group: group.nlargest(5).values.tolist())
Site
A [1733, 150, 70, 20, 4]
B [1500, 55, 22]
C [180]
Name: EnteroCount, dtype: object
摘要
df['swim'] = np.where(
(df.groupby('Site').EnteroCount.transform(max) > 110) |
(df.groupby('Site').EnteroCount.transform(lambda group: gmean(group.nlargest(5))) > 30),
'unacceptable', 'acceptable')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.