用对象创建pandas group的求和和除法

时间:2017-05-11 23:29:18

标签: python pandas

我有一个城市列表和一个虚拟变量。 1表示存在欺诈订单,0表示订单良好。我正在尝试确定订单欺诈的百分比。

因此,我正在尝试:

  1. 按城市分组
  2. 创建他们所做订单数量的总和,
  3. 然后确定欺诈的订单百分比。
  4. 我的数据框:

    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
    

    但是,我不确定是否/如何获得总和列然后计算百分比。

    感谢任何帮助!

2 个答案:

答案 0 :(得分: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

另一种不使用dict重命名的方法:

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 :(得分:1)

在0/1,True / False列中获取百分比的最简单,pythonic方法是取平均值。

$people = [];
foreach($users as $user)
{
  $people[] = array(
    'full_name' => $user['first_name'].' '. $user['last_name'],
    'phone_no' => $user['phone_no'],
  );
}

foreach ($people as $one) {

    $name = $one['full_name'];
    $phone = $one['phone_no'];

    $sms = $client->account->messages->create(
        $phone,

        array(
            'from' => "+15017250604", 
            'body' => "Hey $name, Monkey Party at 6PM. Bring Bananas!"
        )
    );
    echo "Sent message to $name";
 }

输出:

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)