2017-05-11 12 views
2

私は都市とダミー変数のリストを持っています。 A 1は不正注文があったことを示し、0は注文が良好であったことを示します。私は、注文が何パーセントの不正であったかを判断しようとしています。 パンダのgroupbyオブジェクトで合計と分割を作成する

  • はその後詐欺だった注文の何パーセントかを決定、彼らが作った注文数の合計を作成します
  • によって

    1. グループ:したがって

      は、私がしようとしています。

    マイデータフレーム:

    df_city = pd.DataFrame({'City':['LA', 'NYC', 'NYC', 'LA', 'Chicago', 'NYC'], 
         'isFraud':[1, 0, 0, 1, 0, 1]}) 
    

    私はでき都市別グループ:

    group = df['isFraud'].groupby(df['City']).count() 
    
    City  LA   2 
         NYC   3 
         Chicago  1 
    

    しかし、上記の彼らは、閾値を満たしているかどうか抜け出すことはありません。

    は、私は、各ダミーの列を作成しました:私は合計列を取得し、パーセントを計算することができる方法/場合

    df_fraud = pd.get_dummies(df_city['isFraud']) 
    df_city = df_city.join(df_fraud) 
    
    df_city.rename(columns={0 : 'Non-Fraud', 1 : 'Fraud'}, inplace=True) 
    df_city['Fraud'].where(df_city['Fraud'] == 0, np.nan) 
    df_city['Non-Fraud'].where(df_city['Non-Fraud'] == 0, 1) 
    
    #Group by City 
    group_fraud_rate = df_city[['Fraud', 'Non-Fraud']].groupby(df_city['ship_city']).count()` 
    
          Fraud Non-Fraud 
    LA   2   0 
    NYC  1   2 
    Chicago 0   1 
    

    は、しかし、私はよく分かりません。

    ご協力いただきましてありがとうございます。

    答えて

    3

    あなたはAGG機能を使用して、個別に詐欺、非詐欺と詐欺のパーセントを計算することができます。

    df.groupby(df['City'])['isFraud'].agg({'Fraud':sum, 'Non-Fraud': lambda x: len(x)-sum(x), 'Fraud_Pct': lambda x: float(sum(x))/len(x)}) 
    Out[1084]: 
         Non-Fraud Fraud Fraud_Pct 
    City         
    Chicago   1  0 0.000000 
    LA    0  2 1.000000 
    NYC    2  1 0.333333 
    

    辞書の名前変更を使用せずにこれを行うための別の方法:

    df.groupby(df['City'])['isFraud'].agg(['sum', lambda x: len(x)-sum(x),'mean']).rename(columns={'sum':'Fraud','<lambda>': 'Non-Fraud','mean': 'Fraud_Pct'}) 
    
    +1

    FutureWarning:名前を変更してdictを使用することは推奨されず、将来のバージョンで削除されます。ディクショナリの名前変更は、次の[docs]に従って0.20で廃止されました(http://pandas.pydata.org/pandas-docs/version/0.20/whatsnew.html#deprecate-groupby-agg-with-a-dictionary-when-名前変更)。 –

    +0

    @Scottに感謝します。このような便利な機能が削除されるのを見て悲しいです。 – Allen

    +0

    うまくやった。 =) – Moondra

    1

    0/1のパーセントを得る最も簡単な方法は、真/偽の列は平均を取ることです。

    df_out = df_city.groupby('City')['isFraud'].agg([lambda x: (~x.astype(bool)).sum(),'sum','mean']) 
    df_out.columns = ['Non-Fraud','Fraud','Pct. Fraud'] 
    print(df_out) 
    

    出力:

      Non-Fraud Fraud Pct. Fraud 
    City         
    Chicago   1  0 0.000000 
    LA    0  2 1.000000 
    NYC    2  1 0.333333 
    
    +1

    結果は非常に期待される出力と一致していないようです。 – Allen

    +0

    おっと、そうです。私はそのカウント関数を変更する必要があります。ありがとう@Allen –

    +0

    さて、私は解決策を変更しました。 –

    関連する問題