如何在Pandas中压平多个指数(实际上只有一个级别)?value_counts只返回多索引



Pandas 1.1.4

考虑

df4 = pd.DataFrame({
'a': [1, 2, 3, 4]
})
counts = df4.value_counts().astype(np.int)
print(counts.index)
counts.reindex(counts.index.to_flat_index())
print(counts.index)
print(counts.index.to_flat_index())

输出:

MultiIndex([(4,),
(3,),
(2,),
(1,)],
names=['a'])
MultiIndex([(4,),
(3,),
(2,),
(1,)],
names=['a'])
Index([(4,), (3,), (2,), (1,)], dtype='object')

我希望能够与交换

df5 = pd.Series([5, 6, 7, 8], index=[1, 2, 3, 4])
print(df5.index)

其CCD_ 1为

int64索引([1,2,3,4],dtype='in64'(。

请注意,df4的索引与df5的索引相同,但value_counts使其成为多索引。


如何解决此问题?不平坦我尝试似乎工作。

您可以从多索引的第0级提取索引,如下所示:

>>> counts.index.get_level_values(0)
Int64Index([4, 3, 2, 1], dtype='int64', name='a')

然后你可以把索引换成这样的值:

new_index = pd.Series([5, 6, 7, 8], index=[1, 2, 3, 4])
new_counts = counts.set_axis(
counts.index.get_level_values(0).map(new_index)
)
print(new_counts)
a
8    1
7    1
6    1
5    1
dtype: int64

但是,您可以简单地在列本身调用.value_counts(),以避免对多索引进行篡改:

df['a'].value_counts()

当panda像本例中那样从字典创建数据帧时,它假设传递的dict的键应该是生成的dataframe的列。如果键应该是行,您应该初始化您的数据帧如下:

df4 = pd.DataFrame({'a': [1, 2, 3, 4]}, orient='index')

然后运行时:

print(counts.index.to_flat_index())

你得到

Index([(1, 2, 3, 4)], dtype='object')

相关内容

最新更新