python-3.x - 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 让我意识到!
解决方案
我想我自己找到了答案。
“时间”列中有重复的时间戳,如果所选列中有重复值,Pandas 似乎无法正确设置索引()。这是完全有道理的,因为具有重复项的索引将毫无意义。
顺便说一句,我通过使用verify_integrity=True
set_index() 函数中的参数发现了这个问题。所以我建议使用该参数来避免这种麻烦。
df_test = df_test.set_index(keys='time', drop=True, verify_integrity=True)
删除重复行后,现在一切正常。
推荐阅读
- firebase - 未处理的异常:PlatformException(functionsError,云函数因异常失败。,{消息:PERMISSION_DENIED,)
- java - 使用 apache POI 和 java 访问 excel 数据时出错
- javascript - Chrome 和 Firefox 上的时区错误
- vba - 试图将 ObjPtr 反转为对象我得到内核在 64 位中未找到错误 53,但在 32 位中未找到
- azure - 创建要由 Azure 逻辑应用接收的 Azure 存储帐户事件订阅的问题
- javascript - 如何根据用户输入更改元素的值
- javascript - “src 属性”未从外部 JavaScript 文件或其他脚本块中获取值
- asp.net-core - asp.net core web api本地https问题
- autocomplete - PhpStorm - li [TAB] 使用“link”元素而不是“li”元素自动完成
- excel - 如何知道我的加载项已在 Excel 任务窗格 Office 365 中打开?