函数DataFrame.describe()的输出取决于数据类型。
在数字dtype上使用时,它将返回以下输出:
f.ID.describe()
count 7583.000000
mean 704013.191613
std 1192979.985253
min 10575.000000
25% 10575.000000
50% 10864.000000
75% 2084161.000000
max 6422339.000000
这在大多数情况下都有意义,除非列包含不应聚合的数值数据。例如:一个ID。
在这种情况下,以下输出更合适:
count 7583
unique 68
top 10864
freq 3390
以上是您为对象dtype获得的输出。对于ID而言,列的唯一性和大小对我来说更有价值,而不是平均值或分布。
据我所知,对数字dtype执行此操作的唯一方法是首先将其转换为对象dtype,例如
f.ID.astype(str).describe()
数据类型转换可能会带来性能损失(对于我想象的大型数据集,更明显)。这就是为什么我想知道是否有任何其他方法来修改describe()
行为,除了更改数据类型(动态或创建DataFrame)。
答案 0 :(得分:1)
我有点倾向于像你一样做,并在飞行中转换为字符串以获得所需的输出。我不认为性能损失会非常严重,并且怀疑你是否经常使用describe()
来解决这个问题。
那就是说,值得考虑如何存储一个真正的标识符而不是值或度量的数字。如果它是唯一ID(例如美式社会安全号码),您只需将其存储为整数即可。如果它不是唯一的,那么将其存储为分类列可能是有意义的。独特性越低(或重复次数越多),您作为分类存储的效果越好。
这是一个简短的例子,ID的值可以是1到4。
>>> df=pd.DataFrame({ 'id_int':np.random.randint(1,5,20) })
>>> df['id_cat'] = df.id_int.astype('category')
>>> df.dtypes
id_int int64
id_cat category
>>> df.memory_usage()
id_int 160
id_cat 52
正如您所看到的,ID的分类版本使用了大约1/3的内存(当然,这取决于重复的数量)。
如果你describe()
它将被视为字符串对象。
>>> df.id_cat.describe()
count 20
unique 4
top 1
freq 8