向新的 pandas dataframe 添加列标题

4

我正在使用 .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
2个回答

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

通常情况下这是没问题的,但如果你尝试在不能聚合的列上使用聚合方法,例如如果你有 str 类型的列并且决定调用 mean,那么一些聚合函数将会出现错误。


2

您可以在.groupby()函数中使用as_index=False参数:

results = df.groupby(["X", "Y", "Z", "F"], as_index=False).size().rename(columns={0:'Count'})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接