2016-04-02 28 views
1

私はdfに列を作成しようとしています。これは、指定された時刻の水が泳ぐことができる品質であるかどうかを教えてくれます。私は幾何学的な意味で壁に当たっています。複雑な条件付きの列を作成する(幾何平均)Python

これは、私が働いている何のようなミニサンプル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
OR
5か幾何平均(加重平均)が30より大きいサンプルが多数あります。

「許容」または「許容しない」という値を割り当てるカラムを作成したいとします。これらの条件の両方に基づいて「可能」である。最初の条件は、以下の、しかしgmeanに持ち込む私にできることはそれほど簡単ではありません(またはそれですか?):

df['swim'] = np.where(df['EnteroCount']>=110, 'unacceptable', 'acceptable') 

これを効率的に行うことができるか見てみたいです。

+0

幾何平均の計算方法やサンプルの入手方法は不明です。各レコードはサンプルなので、5つ以上の値を持つレコードを30より大きくしたいのですか? – Alexander

+0

「幾何平均を持つ5つ以上のサンプル」は5つのサンプルですか?特定のサイトの幾何平均?そして、あなたはサンプルレベルまたはサイトレベルを決定したいですか? – ayhan

+0

幾何平均が実際に計算されているかについてより多くのデータを提供できますか?それ以外の場合は、np.whereに条件を追加するだけです。 –

答えて

2

それが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 

5つの最高値があなたに高い値を与えるグループでのST幾何平均、あなたはこれを使用することができます。

>>> 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.groupby('Site').EnteroCount.apply(lambda group: gmean(group.nlargest(5))) 

あなたはそれが、その後gmeanためのパラメータとして慣れるグループで最大5つの値を選択しているかを確認することができますサマリー

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') 
関連する問題