1.删除重复元素
使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为TRUE.
使用drop_duplicates()删除重复的行.
df = DataFrame({'color':['white','red','white'],'size':[10,20,10]})
df
#duplicated检查是不是是重复值,不是重复值返回false,是重复返回True
df.duplicated()
#删除重复的行
df.drop_duplicates()
2.映射
映射:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
需要使用字典:
map = {
'label1':'value1',
'label1':'value2',
}
映射包含三种操作:
- replace()函数:替换元素
- map()函数:新建一列,也可以用来检索文章的敏感字
- rename()函数:替换索引
replace()函数:替换元素
df = DataFrame({'color':['white','red','white'],'size':[10, 20,10]})
df
color | size |
---|---|
0 | white |
1 | red |
2 | white |
d = {'white':255,'red':128}
df.replace(d)
color | size | |
---|---|---|
0 | 255 | NaN |
1 | 128 | 20.0 |
2 | 255 | 10.0 |
replace还经常用来替换NAN元素
df['size'][0] = np.nan
map()函数:新建一列
使用map()函数,由已有的列生成一个新列
df2 = DataFrame(np.rando.randint(0,150,size=(4,2)),
columns=['python','java'],
index = list('abcd'))
df2
#使用map函数新建一列,map函数中可以使用lambda函数
#生成一个math的列
df2['Math'] = df2['python'].map(lambda x:x+20)
df2
python | java | Math |
---|---|---|
a | 26 | 68 |
b | 9 | 13 |
c | 72 | 94 |
d | 64 | 128 |
def level(x):
if x > 100:
return 'perfect'
elif x < 100 & x >= 80:
return 'excellent'
elif x < 80 and x >= 60:
return 'fail'
else:
return 'bad'
df2['level'] = df2['Math'].map(level)
df2
python | java | Math | level |
---|---|---|---|
a | 26 | 68 | 46 |
b | 9 | 13 | 29 |
c | 72 | 94 | 92 |
d | 64 | 128 | 84 |
transform()和map()类似
transform中的值只能是一个function
df2['Math'] = df2['Math'].trandform(
lambda x:x+np.random.randint(0,50,size=1)[0])
df2
#删除level这一列
df2.drop('level',axis=1,inplace=True)
df2
df2['level'] = df2['java'].transform(level)
3)rename()函数:替换索引
任然是新建一个字典
df2
python | java | Math | level |
---|---|---|---|
a | 26 | 68 | 52 |
b | 9 | 13 | 55 |
c | 72 | 94 | 114 |
d | 64 | 128 | 121 |
df2.rename({‘a’:’张三’,’python’:’巨蟒’},axis=0)
python | java | Math | level |
---|---|---|---|
张三 | 26 | 68 | 52 |
b | 9 | 13 | 55 |
c | 72 | 94 | 114 |
d | 64 | 128 | 121 |
df2.rename({‘a’:’张三’,’python’:’巨蟒’},axis=1)
巨蟒 | java | Math | level |
---|---|---|---|
a | 26 | 68 | 52 |
b | 9 | 13 | 55 |
c | 72 | 94 | 114 |
d | 64 | 128 | 121 |
rename中的参数值可以是一个func
def index_rename(item):
if item == 'a':
return '张三'
else:
return '李四'
python | java | Math | level |
---|---|---|---|
张三 | 26 | 68 | 52 |
李四 | 9 | 13 | 55 |
李四 | 72 | 94 | 114 |
李四 | 64 | 128 | 121 |
3.异常值
df3 = DataFrame(np.random.randint(0,150,size=(10,4)),columns=['python','english','java','PHP'])
df3
python | java | PHP | englisg |
---|---|---|---|
0 | 145 | 32 | 110 |
1 | 7 | 149 | 30 |
2 | 80 | 41 | 49 |
3 | 125 | 45 | 101 |
4 | 13 | 65 | 127 |
5 | 28 | 53 | 91 |
6 | 5 | 100 | 103 |
7 | 14 | 36 | 61 |
8 | 0 | 6 | 56 |
9 | 27 | 37 | 95 |
使用describe()函数查看每一列的描述性统计量
df3.describe()
python | java | PHP | englisg |
---|---|---|---|
count | 10.000000 | 10.000000 | 10.000000 |
mean | 44.400000 | 56.400000 | 82.300000 |
std | 53.007756 | 40.628944 | 31.216271 |
min | 0.000000 | 6.000000 | 30.000000 |
25% | 8.500000 | 36.250000 | 57.250000 |
50% | 20.500000 | 43.000000 | 93.000000 |
75% | 67.000000 | 62.000000 | 102.500000 |
max | 145.000000 | 149.000000 | 127.000000 |
使用std()函数可以求得DataFrame对象每一列的标准差
df3.std()
python 53.007756
java 40.628944
PHP 31.216271
englisg 41.668667
dtype: float64
4.排序
使用.take()函数排序
可以借助np.random.permutation()函数随机排序
#生成指定大小的矩阵
np.random.permutation([4,2])
随机抽样
当DataFrame规模足够大时,直接使用np.random.randint()函数,配合take()函数实现随机抽样
df4 = DataFrame(np.random.randint(0,150,size=(100,4)),
columns=['python','java','Math','China'])
df4
#以上代码执行后会生成100行4列的数据
#从100个数据中抽取50个,可用于抽奖活动
df4.take(np.random.randint(0,100,size=50))
5.数据聚合
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值.
数据分类处理:
分组:先把数据分为几组
用函数处理:为不同组的数据应用不同的函数以转换数据
合并:把不同组得到的结果合并起来
数据处理的核心:groupby()函数
df5 = DataFrame({'item':['萝卜','白菜','西红柿','辣椒','萝卜','西红柿','白菜','西红柿','辣椒','西瓜','芹菜'],
'seller':['李大妈','王大妈','杨大妈','李大妈','王大妈','杨大妈','李大妈','王大妈','杨大妈','杨大妈','李大妈'],
'price':np.random.randint(3,10,size=11)},
columns = ['item','seller','price'])
df5
item | seller | price |
---|---|---|
0 | 萝卜 | 李大妈 |
1 | 白菜 | 王大妈 |
2 | 西红柿 | 杨大妈 |
3 | 辣椒 | 李大妈 |
4 | 萝卜 | 王大妈 |
5 | 西红柿 | 杨大妈 |
6 | 白菜 | 李大妈 |
7 | 西红柿 | 王大妈 |
8 | 辣椒 | 杨大妈 |
9 | 西瓜 | 杨大妈 |
10 | 芹菜 | 李大妈 |
#找出蔬菜中最便宜的,首先分组,然后再找出最小/大的值
df5.groupby(['item]).min()
df5.groupby(['item']).max()
#求平均值,并且添加前缀
mean_price = df5.groupby(['item']).mean().add_prefix('mean_')
mean_price
item | mean_price |
---|---|
白菜 | 6.5 |
芹菜 | 9.0 |
萝卜 | 5.5 |
西瓜 | 7.0 |
西红柿 | 8.0 |
辣椒 | 7.0 |
#把得到的平均值融合到原表中
#left_on设定左边表的关联列,右边对齐,多对多
df6 = pd.merge(df5,mean_price,left_on='item',right_index=True)
df6
item | seller | price | mean_price |
---|---|---|---|
0 | 萝卜 | 李大妈 | 6 |
4 | 萝卜 | 王大妈 | 6 |
1 | 白菜 | 王大妈 | 7 |
6 | 白菜 | 李大妈 | 7 |
2 | 西红柿 | 杨大妈 | 8 |
5 | 西红柿 | 杨大妈 | 4 |
7 | 西红柿 | 王大妈 | 8 |
3 | 辣椒 | 李大妈 | 5 |
8 | 辣椒 | 杨大妈 | 8 |
9 | 西瓜 | 杨大妈 | 4 |
10 | 芹菜 | 李大妈 | 4 |
可以使用transform和apply实现相同的功能
在transform或者apply中传入函数即可
df7.groupby(['item'])(['price']).sum()
df7.groupby(['item'])('price').transform(sum)
df7.groupby(['item'])['price'].transform(sum)
transform()与apply()函数还能传入一个函数或者lambda
#apply和transform最大的区别在于,transform做了循环(交叉表),apply比较简洁
df7.groupby(['item'])['price'].apply(sum)
df7.groupby(['item'])['price'].apply(np.mean)
备注:以上部分知识点自己还不是很清楚,待继续学习后再总结