数据框中具有列表值的分类列

时间:2018-05-15 03:09:16

标签: python pandas

我有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列中的许多值都不同。希望看到任何减少此列内存使用量的方法。

1 个答案:

答案 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.