将列标题添加到新的pandas数据帧

时间:2016-05-04 21:53:51

标签: python pandas

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

答案 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'})