python学习-pandas(5)

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)

备注:以上部分知识点自己还不是很清楚,待继续学习后再总结

猜你喜欢

转载自blog.csdn.net/u014229742/article/details/80752205