问题背景:
之前运行测试好好的程序,忽然出现了报错,还是merge时候的类型错误,这个bug有点蹊跷。
问题分析:
代码:进行聚类之后计算平均值与方差
1
|
tmp_df = df[[ 'object1' , 'float' ]].groupby([ 'object1' ]).head( 20 ).groupby([ 'object1' ])[ 'float' ].agg([ 'mean' , 'sum' ]).reset_index() |
这个输出的就是原本的数据类型:一个object,一个float64
1
|
tmp_df = http_df[[ 'object1' , 'object2' , 'float' ]].groupby([ 'object1' , 'object2' ]).head( 20 ).groupby([ 'object1' , 'object2' ])[ 'float' ].agg([ 'mean' ]).reset_index() |
这个输出就会修改object为float,
差别只在于一个是使用一个特征进行聚类,一个是使用两个特征进行聚类
问题原因(个人猜测,仅供参考):
pandas进行聚类的时候,就算之前已经定好各个列的类型,如果里边没有数据的时候,使用一列进行聚类不会修改列的类型,但是如果同时使用两列进行聚类就会修改列的类型。
所以才会出现后面进行merge时候,类型不同报错
有数据输入的时候这个报错不会发生,没有数据的时候就会发生。
补充:python数据处理--按照数据差值大小进行聚类(归类)
近来在做数据处理的工作中,遇到了数据分类的问题,利用python的各种方便库,写了这么个以数据差值大小进行归类的方法。
应用场景:
有一批数据集,如list=[1,2,3,4,9,10,11,20,20,1,1.1,2.1,100],将其按照数值大小进行归类,即数值比较接近的归为一类,故需要先设置一个阈值,以进行划分。
具体实现如下:
其中输入参数Data_set为输入的数据集,可以为列表、数组、Series、DataFrame。threshold为数据大小分类的门限值。
输出class_k为数据归类列表集合,index_list为数据归类对应的索引集合。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
def threshold_cluster(Data_set,threshold): #统一格式化数据为一维数组 stand_array = np.asarray(Data_set).ravel( 'C' ) stand_Data = Series(stand_array) index_list,class_k = [],[] while stand_Data. any (): if len (stand_Data) = = 1 : index_list.append( list (stand_Data.index)) class_k.append( list (stand_Data)) stand_Data = stand_Data.drop(stand_Data.index) else : class_data_index = stand_Data.index[ 0 ] class_data = stand_Data[class_data_index] stand_Data = stand_Data.drop(class_data_index) if ( abs (stand_Data - class_data)< = threshold). any (): args_data = stand_Data[ abs (stand_Data - class_data)< = threshold] stand_Data = stand_Data.drop(args_data.index) index_list.append([class_data_index] + list (args_data.index)) class_k.append([class_data] + list (args_data)) else : index_list.append([class_data_index]) class_k.append([class_data]) return index_list,class_k |
测试如下:
1
2
3
4
5
6
7
8
|
import numpy as np from pandas import Series,DataFrame Data_set = [ 1 , 1.1 , 0.9 , - 5 , 2 , 100 , 99 , - 4.2 , 10000 , 0 ] index_list,class_k = threshold_cluster(Data_set, 5 ) index_list Out[ 10 ]: [[ 0 , 1 , 2 , 4 , 9 ], [ 3 , 7 ], [ 5 , 6 ], [ 8 ]] class_k Out[ 11 ]: [[ 1.0 , 1.1 , 0.9 , 2.0 , 0.0 ], [ - 5.0 , - 4.2 ], [ 100.0 , 99.0 ], [ 10000.0 ]] |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/Shine_Su/article/details/112310243