簡體   English   中英

創建復雜的條件列(幾何平均值)Python

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM