我有Dataframe
存储不同类型的列, float / int / object 。
由于Dataset
太大,我正在寻找减少内存使用的方法。
我发现可以采用"Categorical"
来减少"Object"
类型列的内存使用量,并将其应用于它们。但是,一旦我更改了列表值的列,错误"TypeError: unhashable type: 'list'"
这是我的数据框
vs_df = pd.DataFrame({'plan_name': ['abc', 'def'], 'plan_id': [10001, 10002]})
vs_df['handled_plans_id'] = np.empty((len(vs_df), 0)).tolist()
vs_df.at[[0, 1], 'handled_plans_id'] = [[105,120], []]
vs_df.handled_plans_id = vs_df.handled_plans_id.astype('category') # Error here
print(vs_df)
plan_id plan_name handled_plans_id
0 10001 abc [105, 120]
1 10002 def []
错误:
TypeError: unhashable type: 'list'
File "pandas\_libs\hashtable_class_helper.pxi", line 1367, in pandas._libs.hashtable.PyObjectHashTable.get_labels
任何解决此问题的方法或使用列表值减小此列的大小都是值得赞赏的。谢谢!
更新
handled_plans_id
列中的许多值都不同。希望看到任何减少此列内存使用量的方法。
答案 0 :(得分:0)
使用元组。
vs_df = pd.DataFrame({'plan_name': ['abc', 'def'], 'plan_id': [10001, 10002]})
vs_df['handled_plans_id'] = [()]*len(vs_df)
vs_df.at[[0, 1], 'handled_plans_id'] = [(105,120), ()]
vs_df.handled_plans_id = vs_df.handled_plans_id.astype('category')
print(vs_df)
plan_id plan_name handled_plans_id
0 10001 abc (105, 120)
1 10002 def ()
如果元组是已知的最大长度,则可以将它们拆分为列。分类应该有所帮助,但如果你有太多不同的数字则不会。分类数据通常是one of a small set--an enumeration,如'heart','黑桃','钻石','俱乐部'等等。如果您有太多不同的值,转换为类别将无济于事。
如果文件太大而无法放入内存,you can chunk it.