我有以下pandas数据框:
Name | EventSignupNo | Attended | Points Smith | 0145 | Y | 20.24 Smith | 0174 | Y | 29.14 Smith | 0239 | N | 0 Adams | 0145 | N | 0 Adams | 0174 | Y | 33.43 Morgan | 0239 | Y | 31.23 Morgan | 0244 | Y | 23.15
我想计算的是每人参加和未参加的活动数量,以及每人的总积分。所以我做一个groupby:df.groupby([Name, Attended]).agg({"Attended": "count", "Points": "sum"}).rename(columns = {"Attended: "Count"}).reset_index()
df.groupby([Name, Attended]).agg({"Attended": "count", "Points": "sum"}).rename(columns = {"Attended: "Count"}).reset_index()
这会给我类似的东西:
Name | Attended | Count | Points Smith | Y | 2 | 49.38 Smith | N | 1 | 0 Adams | Y | 1 | 33.43 Adams | N | 1 | 0 Morgan | Y | 2 | 54.38
但我想要类似的东西:
Name | Attended | Count | Points Smith | Y | 2 | 49.38 Smith | N | 1 | 0 Adams | Y | 1 | 33.43 Adams | N | 1 | 0 Morgan | Y | 2 | 54.38 Morgan | N | 0 | 0
我尝试使用pd.MultiIndex尝试填充丢失的零计数,但无济于事。我已经阅读了其他类似的问题,但是在使用MultiIndex处理连续点列时遇到了麻烦。任何想法如何做到这一点?
您可以使用groupby+做到这一点agg。为了您与精确的输出Y,并N在每个级别,你需要reindex:
groupby
agg
Y
N
reindex
g = df.groupby(['Name', 'Attended'], sort=False).Points.agg(['count', 'sum']) g count sum Name Attended Smith Y 2 49.38 N 1 0.00 Adams N 1 0.00 Y 1 33.43 Morgan Y 2 54.38 idx = pd.MultiIndex.from_product([g.index.levels[0], ['Y', 'N']]) idx MultiIndex(levels=[['Adams', 'Morgan', 'Smith'], ['N', 'Y']], labels=[[2, 2, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0]]) g.reindex(idx, fill_value=0) count sum Smith Y 2 49.38 N 1 0.00 Adams Y 1 33.43 N 1 0.00 Morgan Y 2 54.38 N 0 0.00