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=False
parameter 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读取所有数据。