如何在Pandas中展平多个索引(实际上只有一个级别)?值\u counts仅返回多索引

2024-05-15 10:49:00 发布

您现在位置:Python中文网/ 问答频道 /正文

熊猫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)

谁的index

Int64Index([1,2,3,4],dtype='int64')

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


我如何解决这个问题?我试过的任何压扁似乎都不管用


Tags: todataframeindexnamesvaluenppdprint
2条回答

当pandas从字典(如本例所示)创建数据帧时,它假定传递的dict的键应该是结果数据帧的列。如果键应为行,则应按如下方式初始化数据帧:

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

然后运行时:

print(counts.index.to_flat_index())

你得到

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

您可以从多索引的第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()

相关问题 更多 >