pandas与多种数据types的系列崩溃

我有一个简单的Excel文件有两列 – 一个分类列和另一个数字列,我读入pandas与read_excel函数如下

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

第一列是具有多种types的Objecttypes。 由于excel格式不正确,该列包含时间戳,浮点数和文本的组合。 但它通常应该只是一个简单的文本列

 from datetime import datetime from collections import Counter df['random_names'].dtype 

DTYPE( 'O')

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

Counter({type'unicode'>:15427,type'datetime.datetime'>:18,type'float'>:2})

当我做了一个简单的groupby,它crashes the python kernel没有任何错误消息或通知 – 我试图从jupyter和一个小的自定义烧瓶应用程序没有任何运气。

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

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

我试着用pdb进行debugging,以便跟踪崩溃点,但是无法越过pandas / core / groupby.py模块中的cython函数

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

在pandas可能的错误 – 而不是直接崩溃不应该它抛出一个exception,并优雅地退出?

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

 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

对于我来说,当大pandas尝试sorting组密钥时,似乎会发生崩溃。 如果我将sort=Falseparameter passing给.groupby()则操作成功。 这可能也适合你。 这种sorting看起来是一种不实际涉及pandas物体的一种粗糙的操作,因此最终可能是一个NPO问题。 (例如, df.random_names.values.argsort()也崩溃了。)

经过更多的游戏后,我猜测这个问题与某些模糊的条件有关,这是由于在numpy的sorting操作中进行的特定比较而产生的。 对我来说,这崩溃了:

 df.random_names.values[14005:15447] 

但是从片的两端留下一个项目不会再崩溃了。 制作这个数据的副本,然后通过取出单个元素来调整它,这个崩溃将会发生或不发生,这取决于是否从数据中删除了某些看起来随机的元素。 此外,在某些情况下,它会失败,“TypeError:不能比较datetime.datetime到Unicode”(或“date时间到浮动”)的例外。

这部分数据包含一个date时间和一个浮点值,它恰好是一个nan 。 看起来在numpy代码中存在一些奇怪的边缘情况,导致在某些情况下比较失败,而不是引发正确的exception。

要在文章末尾回答这个问题,您可以更轻松地使用read_excel的各种参数(例如converters参数),从头开始以文本值的forms读取所有数据。