Pandas描述数字dtypes的行为

时间:2015-09-02 08:27:22

标签: python python-3.x pandas

函数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)。

1 个答案:

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