Pandas Groupby即使为空也保持一致的水平
Pandas Groupby Consistent levels even if empty
我正在尝试使用 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 列和 reindex 您的结果创建一个新索引:
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)
这是一个 hack1!请使用@Psidom 的回答
df.groupby(['Cat 1','Cat 2']).sum().unstack().stack(dropna=False)
Num
Cat 1 Cat 2
A A 2.0
B 1.0
B A 1.0
B 3.0
C A NaN
B 5.0
D A 1.0
B NaN
好吧,也许不那么黑客但是...
我正在尝试使用 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 列和 reindex 您的结果创建一个新索引:
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)
这是一个 hack1!请使用@Psidom 的回答
df.groupby(['Cat 1','Cat 2']).sum().unstack().stack(dropna=False)
Num
Cat 1 Cat 2
A A 2.0
B 1.0
B A 1.0
B 3.0
C A NaN
B 5.0
D A 1.0
B NaN
好吧,也许不那么黑客但是...