pandas在包含多种数据类型的系列中崩溃

时间:2016-03-25 17:12:25

标签: python excel pandas group-by crash

我有一个简单的excel文件有两列 - 一个分类列和另一个数字列,我用read_excel函数读入pandas,如下所示

df= pd.read_excel('pandas_crasher.xlsx')

第一列是Object类型,有多种类型。由于excel格式错误,因此该列包含时间戳,浮点数和文本的组合。但它通常应该只是一个简单的文本专栏

from datetime import datetime
from collections import Counter

df['random_names'].dtype 
  

D型细胞(' O&#39)

print Counter([type(i) for i in load_instance['random_names']])

  

计数器({type' unicode'>:15427,键入' datetime.datetime'>:18,   键入' float'>:2})

当我对它进行简单的分组时, crashes the python kernel 没有任何错误消息或通知 - 我尝试从jupyter和一个小的自定义烧瓶应用程序中做到这一点,没有任何运气。

df.groupby('random_names')['random_values'].sum() <<崩溃

它是一个700kb(15k行和2列)的相对较小的文件 - 因此它绝对不是内存问题

我尝试用pdb进行调试,以追踪崩溃但无法通过pandas / core / groupby.py module

中的cython函数的点
  

def _cython_operation(self,kind,values,how,axis)

pandas中可能出现的错误 - 而不是直接崩溃,它不会抛出异常并优雅地退出吗?

然后我使用以下函数将各种数据类型转换为文本

def custom_converter(x):
    if isinstance(x,datetime)  or isinstance( x, ( int, long, float ) ):
        return str(x)
    else:
        return x.encode('utf-8')

df['new_random_names'] = df['random_names'].apply(custom_converter)

df['new_random_names'].groupby('random_names')['random_values'].sum() << does not crash

应用自定义函数可能是执行此操作的最慢方法。有没有更好/更快的方法呢?

此处的Excel文件:https://drive.google.com/file/d/0B1ZLijGO6gbLelBXMjJWRFV3a2c/view?usp=sharing

1 个答案:

答案 0 :(得分:1)

对我来说,当pandas尝试对组密钥进行排序时,似乎会发生崩溃。如果我将sort=False参数传递给.groupby(),则操作成功。这对你也有用。排序似乎是一个不实际涉及pandas对象的numpy操作,因此它最终可能是一个numpy问题。 (例如,df.random_names.values.argsort()也会崩溃。)

经过更多的游戏后,我猜这个问题与由于在numpy的排序操作中进行的特殊比较而产生的某种模糊情况有关。对我来说,这崩溃了:

df.random_names.values[14005:15447]

但是从切片的任一端留下一个项目不会再崩溃。制作这些数据的副本,然后通过取出单个元素进行调整,将发生崩溃,具体取决于是否从数据中删除了某些看似随机的元素。此外,在某些情况下,它将失败,但“TypeError:无法将datetime.datetime与unicode进行比较”(或“datetime to float”)除外。

此部分数据包含一个日期时间和一个浮点值,恰好是nan。看起来numpy代码中有一些奇怪的边缘情况导致在某些情况下失败的比较崩溃而不是引发正确的异常。

要回答帖子末尾的问题,您可以更轻松地使用read_excel的各种参数(例如converters参数)以文本值的形式读取所有数据从一开始就是。