我有一个城市列表和一个虚拟变量。 1表示存在欺诈订单,0表示订单良好。我正在尝试确定订单欺诈的百分比。
因此,我正在尝试:
我的数据框:
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
但是,我不确定是否/如何获得总和列然后计算百分比。
感谢任何帮助!
答案 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)