将所有索引保持在多级 pandas groupby 中
Keep all indexes in multilevel pandas groupby
我有以下数据框:
df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4']
当我对它进行分组时,我得到:
df.groupby(['col4','col2']).sum()
col1 col3
col4 col2
1 A 1.1 1.1
D 5.5 14.2
2 B 6.0 6.4
3 A 4.8 8.4
C 3.4 4.5
4 B 2.5 3.3
5 B 5.2 8.6
6 B 3.4 4.3
但是我想要的是每个一级索引都具有相同的二级索引。这是不可能的,因为缺少数据。我想要实现的是:
col1 col3
col4 col2
1 A 1.1 1.1
B 0 0
C 0 0
D 5.5 14.2
2 A 0 0
B 6.0 6.4
C 0 0
D 0 0
3 A 4.8 8.4
B 0 0
C 3.4 4.5
D 0 0
4 A 0 0
B 2.5 3.3
C 0 0
D 0 0
5 A 0 0
B 5.2 8.6
C 0 0
D 0 0
6 A 0 0
B 3.4 4.3
C 0 0
D 0 0
您可以从您的数据创建一个新的 MultiIndex
,然后 reindex
,就像这样。
In [6]: idx = pd.MultiIndex.from_product([df.col4.unique(), df.col2.unique()])
In [9]: (df.groupby(['col4','col2']).sum()
.reindex(idx).fillna(0))
Out[9]:
col1 col3
1 A 1.1 1.1
B 0.0 0.0
C 0.0 0.0
D 5.5 14.2
3 A 4.8 8.4
B 0.0 0.0
C 3.4 4.5
D 0.0 0.0
2 A 0.0 0.0
B 6.0 6.4
C 0.0 0.0
D 0.0 0.0
4 A 0.0 0.0
B 2.5 3.3
C 0.0 0.0
D 0.0 0.0
5 A 0.0 0.0
B 5.2 8.6
C 0.0 0.0
D 0.0 0.0
6 A 0.0 0.0
B 3.4 4.3
C 0.0 0.0
D 0.0 0.0
为了解决缺失的索引,您可能需要重新索引 df.groupby(['col4','col2']).sum()
:
返回的 DataFrame
>>> m = pd.MultiIndex.from_product([df.col4.unique(), df.col2.unique()])
>>> df.groupby(['col4','col2']).sum().reindex(m, fill_value=0)
col1 col3
1 A 1.1 1.1
B 0.0 0.0
C 0.0 0.0
D 5.5 14.2
3 A 4.8 8.4
B 0.0 0.0
C 3.4 4.5
D 0.0 0.0
2 A 0.0 0.0
B 6.0 6.4
C 0.0 0.0
D 0.0 0.0
4 A 0.0 0.0
B 2.5 3.3
C 0.0 0.0
D 0.0 0.0
5 A 0.0 0.0
B 5.2 8.6
C 0.0 0.0
D 0.0 0.0
6 A 0.0 0.0
B 3.4 4.3
C 0.0 0.0
D 0.0 0.0
请注意,unique()
returns 值按照它们在列中出现的顺序排列(例如,此处“3”出现在“2”之前)。您可以通过在重新索引的 DataFrame 上使用 .sortlevel(0)
来更正此问题。
我有以下数据框:
df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4']
当我对它进行分组时,我得到:
df.groupby(['col4','col2']).sum()
col1 col3
col4 col2
1 A 1.1 1.1
D 5.5 14.2
2 B 6.0 6.4
3 A 4.8 8.4
C 3.4 4.5
4 B 2.5 3.3
5 B 5.2 8.6
6 B 3.4 4.3
但是我想要的是每个一级索引都具有相同的二级索引。这是不可能的,因为缺少数据。我想要实现的是:
col1 col3
col4 col2
1 A 1.1 1.1
B 0 0
C 0 0
D 5.5 14.2
2 A 0 0
B 6.0 6.4
C 0 0
D 0 0
3 A 4.8 8.4
B 0 0
C 3.4 4.5
D 0 0
4 A 0 0
B 2.5 3.3
C 0 0
D 0 0
5 A 0 0
B 5.2 8.6
C 0 0
D 0 0
6 A 0 0
B 3.4 4.3
C 0 0
D 0 0
您可以从您的数据创建一个新的 MultiIndex
,然后 reindex
,就像这样。
In [6]: idx = pd.MultiIndex.from_product([df.col4.unique(), df.col2.unique()])
In [9]: (df.groupby(['col4','col2']).sum()
.reindex(idx).fillna(0))
Out[9]:
col1 col3
1 A 1.1 1.1
B 0.0 0.0
C 0.0 0.0
D 5.5 14.2
3 A 4.8 8.4
B 0.0 0.0
C 3.4 4.5
D 0.0 0.0
2 A 0.0 0.0
B 6.0 6.4
C 0.0 0.0
D 0.0 0.0
4 A 0.0 0.0
B 2.5 3.3
C 0.0 0.0
D 0.0 0.0
5 A 0.0 0.0
B 5.2 8.6
C 0.0 0.0
D 0.0 0.0
6 A 0.0 0.0
B 3.4 4.3
C 0.0 0.0
D 0.0 0.0
为了解决缺失的索引,您可能需要重新索引 df.groupby(['col4','col2']).sum()
:
>>> m = pd.MultiIndex.from_product([df.col4.unique(), df.col2.unique()])
>>> df.groupby(['col4','col2']).sum().reindex(m, fill_value=0)
col1 col3
1 A 1.1 1.1
B 0.0 0.0
C 0.0 0.0
D 5.5 14.2
3 A 4.8 8.4
B 0.0 0.0
C 3.4 4.5
D 0.0 0.0
2 A 0.0 0.0
B 6.0 6.4
C 0.0 0.0
D 0.0 0.0
4 A 0.0 0.0
B 2.5 3.3
C 0.0 0.0
D 0.0 0.0
5 A 0.0 0.0
B 5.2 8.6
C 0.0 0.0
D 0.0 0.0
6 A 0.0 0.0
B 3.4 4.3
C 0.0 0.0
D 0.0 0.0
请注意,unique()
returns 值按照它们在列中出现的顺序排列(例如,此处“3”出现在“2”之前)。您可以通过在重新索引的 DataFrame 上使用 .sortlevel(0)
来更正此问题。