数据离散化

数据离散化

  • 时间数据离散化

将时间格式的数据(datatime)以固定转换方式进行转换。

这里转换为周数

#针对时间数据的离散化
df['datetime1']=pd.to_datetime(df['datetime']).apply(lambda x:x.weekday())
df.head()

在这里插入图片描述

  • 多数据离散化

需要重新离散化数据时,重新划分区间

merge将指定列dfmap_dfon中的值为参考合并

#对age的值域进行重构
map_df=pd.DataFrame([['0-10','0-40'],['10-20','0-40'],['20-30','0-40'],['30-40','0-40'],
                    ['40-50','40-80'],['50-60','40-80'],['60-70','40-80'],['70-80','40-80'],
                    ['80-90','>80'],['>90','>80']],columns=['age','age2'])
map_df
 
#离散化
df=pd.merge(df,map_df,how='inner',on=['age'])
df

在这里插入图片描述

  • 自定义区间

pandas中使用pd.qcut或者是pd.cut方法实现数据切割。

pd.qcut(data,q)的函数意义为:

data:需要被切割的数据。

q:需要切割多少个组。

自动分组

qcut = pd.qcut(df['字段'], 6)
qcut.value_counts()

自己指定切割的区间和数量。

这时候可以使用pd.cut实现。
pd.cut(data, bins)参数意义如下:

data:需要被切割的数据。
bins:切割的区间列表。

cut = pd.cut(df["字段"], bins=[-10, -5, 0, 5, 10, 15])
cut.value_counts()
#1、自定义分箱区间
#1)cut方法
bins=[0,200,1000,5000,10000]
df['amount1']=pd.cut(df['amount'],bins)
df
#2)digitize方法
bins=[0,200,1000,5000,10000]  #注意:bins数据是有要求的,bins内的数据一定要是降序或者升序的数据,不能是一堆无序数据。
indices=np.digitize(df['amount'],bins) #返回值为每个值所属区间的索引。
indices
df['amount2']=[str(bins[i-1])+"~"+str(bins[i]) for i in indices] 
df

在这里插入图片描述

  • 独热编码(One-hot编码)离散化

One-Hot编码是将分类数据的所有项,全部都变成列,然后如果某一行中出现这一列,那么就标记为1,否则就标记为0。比如下图将左边的Category变为One-Hot编码后,会把Category中所有唯一的值都添加为新的列。

说口水话就是将一列数据所有可能出现的类别,弄成列名,如果第一行(按原数据的行数)出现了对应的类别,就在该类别下标上1,其余的都是0。这样就能把所有的类别弄成1000、0010、0001这种形式的。

弄成这种形式过后,使用欧式距离(sqrt(a²+b²))计算出类别之间的距离

get_dummies将类别变量转为哑变量

我们看一下它的定义:

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

各参数的含义:

data: array-like, Series, DataFrame

prefix: string, list of strings, dict of strings, default None

prefix_sep: str, default ‘_’ (转换后列名的前缀)

dummy_na: bool, default False(增加一列表示空缺值,如果False就忽略空缺值)

columns: list-like, default None (指定需要实现类别转换的列名)

sparse: bool, default False

drop_first: bool, default False (获得k中的k-1个类别值,去除第一个)

dtype: dtype, default np.uint8

pd.get_dummies(df['Product'], prefix="Product")
# df['Product']中的元素前面以Product_列名的形式

在这里插入图片描述