我有一个城市列表和一个虚拟变量。A 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但是,我不确定是否/如何得到和列,然后计算百分比。
任何帮助都是非常感谢的!
发布于 2017-05-11 23:40:56
您可以使用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'})发布于 2017-05-11 23:38:55
在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.333333https://stackoverflow.com/questions/43927134
复制相似问题