这是MRE:
df = pd.DataFrame({"hour":[1,2,2,3,3,6,6,6], "location":["a","a", "b","b","c","c","c","c"]})
如下所示:
hour location
0 1 a
1 2 a
2 2 b
3 3 b
4 3 c
5 6 c
6 6 c
7 6 c
当我按小时分组并计算每小时发生的时间时,我会得到
df.groupby(["hour"]).count()
>>> location
hour
1 1
2 2
3 2
6 3
In要填充4和5小时并将其计数设置为0。
这就是我想要的:
location
hour
1 1
2 2
3 2
4 0
5 0
6 3
以前我用过
df.groupby(["hour", "location"]).count().unstack(fill_value=0).stack()
我没问题,但现在也不工作。
我认为是因为这一次我仅按一列进行分组,但是当我按两列进行分组时仍然不起作用。我不确定为什么。
答案 0 :(得分:3)
方法GroupBy.count
用于排除缺失值的获取计数,因此有必要在groupby
之后指定缺失值的检查列,例如hour
经过测试:
df = df.groupby(["hour", "location"])['hour'].count().unstack(fill_value=0).stack()
但是,如果省略groupby
之后的列,此方法将使用所有其他列进行计数。因此,如果使用:
print (df.groupby(["hour"]).count())
location
hour
1 1
2 2
3 2
6 3
还有另一列location
,因此它用于计数。
如果使用:
print (df.groupby(["location"]).count())
hour
location
a 2
b 2
c 4
还有另一列hour
,因此它用于计数。
但是如果只有2列DataFrame
,则有必要为避免空DataFrame
指定一列,但这也取决于pandas version:
print (df.groupby(["hour", "location"]).count())
Empty DataFrame
Columns: []
Index: [(1, a), (2, a), (2, b), (3, b), (3, c), (6, c)]
print (df.groupby(["hour", "location"])['hour'].count())
hour location
1 a 1
2 a 1
b 1
3 b 1
c 1
6 c 3
Name: hour, dtype: int64
如果使用方法GroupBy.size
不在乎缺失值,则它不会测试缺失值,因此groupby
之后的列是没有必要的:
df = df.groupby(["hour", "location"]).size().unstack(fill_value=0).stack()
print (df)
hour location
1 a 1
b 0
c 0
2 a 1
b 1
c 0
3 a 0
b 1
c 1
6 a 0
b 0
c 3
dtype: int64