如何使用groupby创建新表并删除重复项

时间:2019-01-12 06:32:57

标签: python python-3.x pandas csv

我想创建一个新的数据集,但是在重新整理数据时遇到了麻烦。 我当前的数据集如下图所示。

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安排数据并计数实例,但结果一直是错误的。请有人帮助我!预先感谢。

2 个答案:

答案 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)

crosstabmargins一起使用,并通过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.sizeunstack用于重塑,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'}))