jupyter利用list去重

 

目录

set的简介:

 一,导入 import pandas as pd 的包

1.1利用pd.read_csv来读取需要分析的数据。

 1.2 方法一

 1.3 方法二

二,利用drop_duplicates()方法对是否愿意下载特征去重

 三,使用 drop_duplicates()方法对多个特征进行去重

4.1求出居住类型、年龄和每月支出这 3 个特征的 pearson 法相似度矩阵

 五,使用equals()方法去重

 5.1 通过遍历的方式进行数据筛选,遍历所有数据

 六,sum 函数、isnull()方法和 notnull()方法的用法

八,求每月支出平均值

总结


set的简介:

        set是Python内置的一种数据类型,它是一个无序、不重复的集合,可以实现高效的去重操作。set的特性可以归纳为以下几点:set中的元素不会重复,即相同的元素只会出现一次;set中的元素是无序的,不能通过索引来访问元素,set中的元素必须是可哈希的,即不可变的类型,例如数字、字符串、元组等;set可以进行交集、并集、差集等常见集合操作,因为set中不能出现重复的元素,

        所以可以利用set的特性对列表进行去重操作,将重复的元素只保留一个,而利用set的特性进行去重操作比比遍历列表进行去重操作更快,可以提高程序的效率。

 一,导入 import pandas as pd 的包

import pandas as pd

1.1利用pd.read_csv来读取需要分析的数据。

download=pd.read_csv('E:/Software/jupyter数组计算基础/data/user_download.csv',
                         index_col=0,encoding='gbk',engine='python')

 1.2 方法一

定义去重函数对比去重前下载意愿选项总数和去重后下载意愿选项总数对比。

list2 = [] #定义一个空列表list2,用于储存去重后的新列表
def del_rep(list1):#定义一个函数del_rep,接受一个列表参数list1
    for i in list1:#遍历列表list1中的每一个元素
        if i not in list2:#如果这个元素不在新列表list2中
            list2.append(i)#将这个元素添加到新列表list2中
    return list2#返回新列表list2
# 去重
# 将下载意愿从数据框中提取出来
download = list(download['是否愿意下载'])
print('去重前下载意愿选项总数为:',len(download))
download_rep = del_rep(download) # 使用自定义的去重函数去重
print('使用方法一去重后下载意愿选项总数为:',len(download_rep))
print('用户选项为:',download_rep)

以下是去重前后的对比

去重前下载愿意选项总数为: 2175
方法一去重后下载意愿选项总数为: 2175
用户选项为: ['Yes']

 1.3 方法二

利用 set 的特性去重。

print('去重前下载意愿选项总数为:',len(download))#去重之前的数据总数
download_set = set(download) # 利用 set 的特性去重
print('使用方法二去重后下载意愿选项总数为:',len(download_set))#去重之后的数据总数
print('用户选项为:',download_set)

以下是用方法二去重前后的对比

去重前下载愿意选项总数为: 2175
方法一去重后下载意愿选项总数为: 2
用户选项为: {'用户编号', '是否愿意下载'}

二,利用drop_duplicates()方法对是否愿意下载特征去重

download = pd.read_csv('./data/user_download.csv',sep=',',engine='python')
download_select = download['是否愿意下载'].drop_duplicates()
print('使用 drop_duplicates()方法去重之后下载意愿选项总数为:',len(download_select))

使用 drop_duplicates()方法去重之后下载意愿选项总数为:

drop_duplicates方法去重之后下载意愿选项总数为: 3

 三,使用 drop_duplicates()方法对多个特征进行去重

all_info = pd.read_csv('./data/user_all_info.csv',sep=',')
print('去重之前用户信息表的形状为:',all_info.shape)
shape_det = all_info.drop_duplicates(subset = ['用户编号','编号']).shape
print('依照用户编号、编号去重之后用户信息表的形状为:',shape_det)

去重之前用户信息表的形状为

去重之前用户的形状为: (2235, 7)
依照用户编号,编号去重之后用户总信息表大小为: (2172, 7)

四,求出年龄特征和每月支出特征的相似度矩阵

corr_det=all_info[['年龄','每月支出']].corr(method='spearman')
corr_det1=all_info[['年龄','每月支出']].corr(method='kendall')
print('年龄和每月支出的相似矩阵为:\n',corr_det)
print('-----------------------------')
print('年龄和每月支出的相似矩阵为:\n',corr_det1)

求出年龄和每月支出的相似度如下:

年龄和每月支出的相似矩阵为:
             年龄      每月支出
年龄    1.000000  0.015617
每月支出  0.015617  1.000000
-----------------------------
年龄和每月支出的相似矩阵为:
             年龄      每月支出
年龄    1.000000  0.011119
每月支出  0.011119  1.000000

4.1求出居住类型、年龄和每月支出这 3 个特征的 pearson 法相似度矩阵

corr_det2 = all_info[['居住类型','年龄','每月支出']].corr(method='pearson')
print('居住类型、年龄和每月支出的 pearson 法相似度矩阵为:\n',corr_det2)

运行结果如下:

居住类型,年龄和每月支出的pearson法相同度矩阵为:
             年龄      每月支出
年龄    1.000000  0.015617
每月支出  0.015617  1.000000

 五,使用equals()方法去重

定义求取特征完全相同的矩阵的方法

def feature_equals(df):#定义一个函数feature_equals,接受一个数据框参数
    df_equals = pd.DataFrame([])#定义一个空的数据框df_equals,用于存储特征相等性的结果for i in df.columns:
    for i in df.columns:##遍历数据框df的每一列
        for j in df.columns:#再次遍历数据框df的每一列
            df_equals.loc[i,j] = df.loc[:,i].equals(df.loc[:,j])# 计算第i列和第j列的特征相等性,将结果存储到df_equals数据框中
    return df_equals#返回特征相等性的数据框df_equals
#应用上述方法
app_desire = feature_equals(all_info)#返回特征相等性的数据框df_equals#应用上述函数
print('app_desire 的特征相等矩阵的前 7行的前7列为:\n',app_desire.iloc[:7,:7])#打印输出变量app_desire的前7行7列,即特征相等矩阵的前7行7列的结果

运行结果如下:

app_desire 的特征相等矩阵的前 7行的前7列为:
          用户编号     年龄     性别   居住类型     编号   每月支出  是否愿意下载
用户编号     True  False  False  False   True  False   False
年龄      False   True  False  False  False  False   False
性别      False  False   True  False  False  False   False
居住类型    False  False  False   True  False  False   False
编号       True  False  False  False   True  False   False
每月支出    False  False  False  False  False   True   False
是否愿意下载  False  False  False  False  False  False    True

 5.1 通过遍历的方式进行数据筛选,遍历所有数据

len_feature = app_desire.shape[0]
dup_col = []#定义一个空列表dup_col,用于储存去重后的新列表
for m in range(len_feature):#遍历列表len_feature中的每一个元素
    for n in range(m + 1, len_feature):#如果这个元素满足下面if语句则加1
            if app_desire.iloc[m, n] & (app_desire.columns[n]not in dup_col):
                dup_col.append(app_desire.columns[n])
# 进行去重操作 
print('需要删除的列为:',dup_col)
all_info.drop(dup_col, axis=1,inplace=True)
print('删除多余列后 all_info 的特征数目为:', all_info.shape[1])

运行结果如下:

需要删除的行为: ['编号']
删除多余行后all_info的特征为: 6

 六,sum 函数、isnull()方法和 notnull()方法的用法

print('all_info每个特征缺失值的数日为:\n',all_info.isnull().sum())
print('all_info每个特征非缺失值的数目为:\n',all_info.notnull().sum())

运行结果如下:

all_info每个特征缺失值的数日为:
 用户编号       0
年龄         6
性别         0
居住类型      22
每月支出      20
是否愿意下载    20
dtype: int64
all_info每个特征非缺失值的数目为:
 用户编号      2235
年龄        2229
性别        2235
居住类型      2213
每月支出      2215
是否愿意下载    2215
dtype: int64

 七,使用 dropna()方法删除缺失值

print ('去除缺失的行前 all_info 的形状为:',all_info.shape)
all_infol = all_info.dropna(axis=0,how='any')
print ('去除缺失的行后 all_info的形状为:',all_infol.shape)
all_infol.to_csv('./data/all_info_notnull.csv',sep=',',index=False)

运行结果如下:

去除缺失的行前 all_info 的形状为: (2235, 6)
去除缺失的行后 all_info的形状为: (2169, 6)

八,求每月支出平均值

mean_num = all_info['每月支出'].mean()#缺失值替换为均值
all_info['每月支出'] = all_info['每月支出'].fillna(mean_num,limit=10)#尝试在函数内增加并改变参数
print('每月支出特征缺失的数目为:\n',
    all_info['每月支出'].isnull().sum())

运行结果如下:

每月支出特征缺失的数目为: 0

总结

        本文介绍了 List 集合去重的 3 种实现思路,其中自定义去重功能实现起来相对繁琐,而 Set 集合依靠其自带的去重特性,可以很方便的实现去重功能,并且可以使用 LinkedHashSet 在去重的同时又保证了元素所在位置不被更改。而最后一种去重的方法,是 JDK 8 中新增的,使用 Stream 中的 distinct 方法实现去重,它的优点是不但写法简单,而且无需创建新的集合,是实现去重功能的首选方法。

        实现最简洁,且去重之后的顺序能和原集合保持一致的实现方法,只有两种:LinkedHashSet 去重和 Stream 去重,而后一种去重方法无需借助新集合,是我们优先考虑的去重方法。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值