python - Pandas Groupby 一致的水平,即使是空的

标签 python pandas group-by pandas-groupby

我正在尝试使用 group by 来创建一个新的数据框,但我需要多索引保持一致。无论子类别是否存在,我都希望按如下方式创建它:

import pandas as pd

df = pd.DataFrame(
    {'Cat 1':['A','A','A','B','B','B','B','C','C','C','C','C','D'],
     'Cat 2':['A','B','A','B','B','B','A','B','B','B','B','B','A'],
     'Num':  [1,1,1,1,1,1,1,1,1,1,1,1,1]})
print df.groupby(['Cat 1','Cat 2']).sum()

输出如下:

             Num
Cat 1 Cat 2     
A     A        2
      B        1
B     A        1
      B        3
C     B        5
D     A        1

但我希望它看起来像

             Num
Cat 1 Cat 2     
A     A        2
      B        1
B     A        1
      B        3
C     A        Nan
      B        5
D     A        1
      B        Nan

我读取了不同的数据,然后以这种格式添加了一列,因此生成的数组看起来像这样:

             Num        Num_added_later
Cat 1 Cat 2                
A     A        2         12
      B        1         5
B     A        1         5
      B        3         3
C     A        Nan       5
      B        5         5
D     A        1         1
      B        Nan       3

最佳答案

您可以根据两个 Cat 列创建一个新索引并重新索引您的结果:

import pandas as pd
new_index = pd.MultiIndex.from_product([df["Cat 1"].unique(), df["Cat 2"].unique()], names = ["Cat 1", "Cat 2"])

df.groupby(['Cat 1','Cat 2']).sum().reindex(new_index)

enter image description here

关于python - Pandas Groupby 一致的水平,即使是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42011215/

相关文章:

python - 使用线帽和线连接的设置绘制线条

python - 如何使用多索引过滤器为列分配值?

mysql - 如何按组分隔两列计数?

mysql - 按任意行数对 SQL 查询进行分区

python - Pandas :如何 groupby/pivot 保留 NaNs?将 float 转换为 str 然后再转换回 float 有效但看起来很复杂

python - 使 flake8 区分未定义函数和星形导入

python - matplotlib:在新窗口中生成新图形以供后续程序运行

python - 如何正确矢量化而不是迭代?

python - pandas 中是否有类似 isin() 的函数接受条件语句而不是值来打印出高度相关的变量?

python - Pandas Dataframe 显示缺失的网格线(Jupyter Notebook)