python - Pandas - 如何对数据框的子列进行分组?

标签 python pandas dataframe group-by

我创建以下数据框:

          Date  ProductID  SubProductId  Value
0   2015-01-02          1             1     11
1   2015-01-02          1             2     12
2   2015-01-02          1             3     NaN
3   2015-01-02          1             4     NaN
4   2015-01-02          2             1     14
5   2015-01-02          2             2     15
6   2015-01-02          2             3     16
7   2015-01-03          1             1     17
8   2015-01-03          1             2     18
9   2015-01-03          1             3     NaN
10  2015-01-03          1             4     21
11  2015-01-03          2             1     20
12  2015-01-03          2             2     21

然后我按产品对子产品进行分组:

 df.set_index(['Date','ProductID','SubProductId']).unstack(['ProductID','SubProductId'])

我想得到以下内容:

             Value
ProductID        1                        2
SubProductId     1     2     3     4      1     2     3
Date
2015-01-02    11.0  12.0    NaN   NaN    14.0  15.0  16.0
2015-01-03    17.0  18.0    NaN   21.0   20.0  21.0   NaN

但是当我打印它时,它会拉出最后以 NaN 开头的每一列:

                 Value
    ProductID        1           2                  1
    SubProductId     1     2     1     2     3      4      3
    Date
    2015-01-02    11.0  12.0     14.0  15.0  16.0   NaN   NaN
    2015-01-03    17.0  18.0     20.0  21.0   NaN   21.0  NaN

如何将每个子列分组到其相应的列下?甚至包含 NaN 的子列

注意:使用的版本:

  • Python版本:3.6.0
  • Pandas 版本:0.19.2

最佳答案

如果您想要对列名称进行排序,可以使用 sort_levelaxis = 1 对列索引进行排序:

df1 = df.set_index(['Date','ProductID','SubProductId']).unstack(['ProductID','SubProductId'])

# sort in descending order
df1.sortlevel(axis=1, ascending=False)

#             Value                                  
#ProductID        2                 1                
#SubProductId     3     2     1     4   3     2     1
#Date                                                
#2015-01-02    16.0  15.0  14.0   NaN NaN  12.0  11.0
#2015-01-03     NaN  21.0  20.0  21.0 NaN  18.0  17.0

# sort in ascending order
df1.sortlevel(axis=1, ascending=True)

#             Value                                  
#ProductID        1                     2            
#SubProductId     1     2   3     4     1     2     3
#Date                                                
#2015-01-02    11.0  12.0 NaN   NaN  14.0  15.0  16.0
#2015-01-03    17.0  18.0 NaN  21.0  20.0  21.0   NaN

关于python - Pandas - 如何对数据框的子列进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43494877/

相关文章:

python - 如何访问我之前保存在 IDLE 和/或 Jupyter 中的 .py 文件?

python - 如何在Python中将数据帧的字段转换为int?

python - 通过属性(点)与括号访问 pandas 列值时出现奇怪的错误

python - Sublime Text 3 中的 PyTorch 自动完成(代码完成)

python - 使用python 3.6 beautiful soup获取html表格行数据

python - 获取 "AttributeError: ' float'对象没有属性 'replace'“替换字符串时出错

python - 使用前 10 个值和下一个值之间的平均值替换 pandas 数据框中的特定值

python - pandas groupby 后缺少列

r - 将宽数据框分解为两个不均匀的列数据框并将其更改为长格式

python - Python 中的原始 CGI