Python 数字数据类型的行为
函数DataFrame.descripe()的输出取决于数据类型 在数字数据类型上使用时,它将返回以下输出:Python 数字数据类型的行为,python,python-3.x,pandas,Python,Python 3.x,Pandas,函数DataFrame.descripe()的输出取决于数据类型 在数字数据类型上使用时,它将返回以下输出: 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 6
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
上面是对象数据类型的输出。列的唯一性和大小对于我来说比平均值或分布更有价值
就我所见,对数字数据类型执行此操作的唯一方法是首先将其强制转换为对象数据类型,例如
f.ID.astype(str).describe()
数据类型转换可能会带来性能损失(我认为对于大型数据集,这一点更为明显)。这就是为什么我想知道除了更改数据类型(动态地或在创建数据帧时)之外,是否还有其他方法可以修改
descripe()
行为。我倾向于像您那样,动态地转换为字符串以获得所需的输出。我认为性能损失不会很严重,我怀疑您是否会经常使用descriple()
,以使这一点变得重要
这就是说,值得考虑如何存储一个真正是标识符而不是值或度量值的数字。如果它是一个唯一的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的内存(当然,这里的节省取决于重复的数量)
如果您descripe()
,它将被视为字符串对象
>>> df.id_cat.describe()
count 20
unique 4
top 1
freq 8
您可以
groupby
ID列并执行聚合:f.groupby('ID',as_index=False)['ID'].agg([np.count非零,np.unique,np.max])
,不确定如何获得freq
计算,尽管我想最接近的是f.groupby('ID',as_index=False)['ID'])。agg([np.count\u非零,np.unique,np.max,pd.Series.value\u counts]).max()
@EdChum这一结果似乎不太正确。count\u non zero
和value\u counts
对于上面的示例都返回3390,而这个值应该是7583。unique
返回6422339;这个值应该是68。如果没有数据,我不知道,但我认为使用groupby和agg是获得更高版本的方法很好的提示!我仍在研究Pandas,但我可以肯定地看到将列存储为类别的好处,这取决于唯一性。特别是在合并具有一对多关系的不同数据帧时。