Pandas Groupby 如何在 DataFrame 中显示零计数
Pandas Groupby How to Show Zero Counts in DataFrame
我有以下 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
我想要的是每人参加和未参加的活动数量,以及每人的积分总和。所以我做了一个分组: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
:
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
我有以下 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
我想要的是每人参加和未参加的活动数量,以及每人的积分总和。所以我做了一个分组: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
:
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