,python-3.x,pandas"/>

首页 > 解决方案 > Pandas set_index() 似乎将某些行的类型更改为

问题描述

我正在观察 Pandas set_index() 函数的意外行为。

为了使我的结果可重现,我将我的 DataFrame 作为pickle 文件df_test.pkl 提供

df_test = pd.read_pickle('./df_test.pkl')
    time            id          avg
0   1554985690182   117455392   4.06300000
1   1554985690288   117455393   0.95800000
2   1554985690641   117455394   2.38400000
...

现在,当我遍历行并打印每个“id”值的类型时,我得到所有单元格的 <class 'numpy.int64'>

for i in df_test.index:
    print(type(df_test.at[i,'id']))
<class 'numpy.int64'>
<class 'numpy.int64'>
<class 'numpy.int64'>
...

现在我将索引设置为“时间”列,一切看起来都很好。

df_test = df_test.set_index(keys='time', drop=True)
                id          avg
time            
1554985690182   117455392   4.06300000
1554985690288   117455393   0.95800000
1554985690641   117455394   2.38400000
...

但是,当我再次遍历行并打印每个“id”值的类型时,我会得到<class 'pandas.core.series.Series'>某些单元格。

for i in df_test.index:
    print(type(df_test.at[i,'id']))
<class 'numpy.int64'>
<class 'numpy.int64'>
<class 'numpy.int64'>
<class 'numpy.int64'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
...

有谁知道这里发生了什么?

更新: 我已经从 df_test DataFrame 中删除了“id_type”列,因为它没有帮助。感谢@Let'stry 让我意识到!

标签: python-3.xpandas

解决方案


我想我自己找到了答案。

“时间”列中有重复的时间戳,如果所选列中有重复值,Pandas 似乎无法正确设置索引()。这是完全有道理的,因为具有重复项的索引将毫无意义。

顺便说一句,我通过使用verify_integrity=Trueset_index() 函数中的参数发现了这个问题。所以我建议使用该参数来避免这种麻烦。

df_test = df_test.set_index(keys='time', drop=True, verify_integrity=True)

删除重复行后,现在一切正常。


推荐阅读