我想创建一个新的数据集,但是在重新整理数据时遇到了麻烦。 我当前的数据集如下图所示。
id result
309209 Successful
309241 Successful
309241 Not Successful
309241 Not Successful
309241 Not Successful
我想将“成功”和“不成功”分开,并通过ID来计数其每个实例,这些ID应该在下面更改为类似的内容。
id success fail total
309209 1 0 1
309241 1 3 4
我尝试使用drop.duplicates或groupby安排数据并计数实例,但结果一直是错误的。请有人帮助我!预先感谢。
答案 0 :(得分:2)
df
:
id result
0 309209 Successful
1 309241 Successful
2 309241 Not Successful
3 309241 Not Successful
4 309241 Not Successful
使用df.groupby()
和pd.get_dummies()
df1 = df.join(pd.get_dummies(df.result,columns='result')).groupby('id').sum().reset_index()
df1['total'] = df1[df1.columns[1:]].sum(axis=1)
print(df1)
id Not Successful Successful total
0 309209 0 1 1
1 309241 3 1 4
答案 1 :(得分:1)
将crosstab
与margins
一起使用,并通过DataFrame.iloc
删除最后一行:
df1 = (pd.crosstab(df['id'], df['result'], margins=True, margins_name='total')
.iloc[:-1]
.reset_index()
.rename_axis(None, axis=1)
.rename(columns={'Not Successful':'fail','Successful':'success'}))
print (df1)
id fail success total
0 309209 0 1 1
1 309241 3 1 4
另一种解决方案,其中GroupBy.size
和unstack
用于重塑,assign
用于新列total
:
df1 = (df.groupby(['id','result'])
.size()
.unstack(fill_value=0)
.assign(total = lambda x: x.sum(axis=1))
.reset_index()
.rename_axis(None, axis=1)
.rename(columns={'Not Successful':'fail','Successful':'success'}))