我正在使用.groupby
和.size
方法从之前的数据框架创建新的pandas数据框。
[in] results = df.groupby(["X", "Y", "Z", "F"]).size()
[out]
9 27/02/2016 1 N 326
9 27/02/2016 1 S 332
9 27/02/2016 2 N 280
9 27/02/2016 2 S 353
9 27/02/2016 3 N 177
此操作符合预期,但结果是没有列标题的数据框。
此SO问题指出以下内容会将列名称添加到生成的数据框
[in] results.columns = ["X","Y","Z","F","Count"]
然而,这似乎没有任何影响。
[out]
9 27/02/2016 1 N 326
9 27/02/2016 1 S 332
9 27/02/2016 2 N 280
9 27/02/2016 2 S 353
9 27/02/2016 3 N 177
答案 0 :(得分:6)
您所看到的是您的分组列作为索引,如果您调用reset_index
,则会恢复列名称
所以
results = df.groupby(["X", "Y", "Z", "F"]).size()
results.reset_index()
应该有效
In [11]:
df.groupby(["X","Y","Z","F"]).size()
Out[11]:
X Y Z F
9 27/02/2016 1 N 1
S 1
2 N 1
S 1
3 N 1
dtype: int64
In [12]:
df.groupby(["X","Y","Z","F"]).size().reset_index()
Out[12]:
X Y Z F 0
0 9 27/02/2016 1 N 1
1 9 27/02/2016 1 S 1
2 9 27/02/2016 2 N 1
3 9 27/02/2016 2 S 1
4 9 27/02/2016 3 N 1
此外,您可以使用count
:
In [13]:
df.groupby(["X","Y","Z","F"]).count().reset_index()
Out[13]:
X Y Z F Count
0 9 27/02/2016 1 N 1
1 9 27/02/2016 1 S 1
2 9 27/02/2016 2 N 1
3 9 27/02/2016 2 S 1
4 9 27/02/2016 3 N 1
你也可以在这里传递参数as_index=False
:
In [15]:
df.groupby(["X","Y","Z","F"], as_index=False).count()
Out[15]:
X Y Z F Count
0 9 27/02/2016 1 N 1
1 9 27/02/2016 1 S 1
2 9 27/02/2016 2 N 1
3 9 27/02/2016 2 S 1
4 9 27/02/2016 3 N 1
这通常很好,但是如果您尝试在dtypes
无法聚合的列上使用聚合方法,则某些聚合函数将会出现问题,例如,如果您有str
dtypes并且您决定调用{{例如,1}}。
答案 1 :(得分:2)
您可以对as_index=False
函数使用.groupby()
参数:
results = df.groupby(["X", "Y", "Z", "F"], as_index=False).size().rename(columns={0:'Count'})