pandas数据处理

删除重复元素


#删除一行或一列
#dropna() 删除空值
#drop_duplicates() 删除重复的行

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

data = np.random.randint(0,150,size=(5,5))
index = list('ABCDE')
columns = list('甲乙丙丁戊')
df = DataFrame(data=data, index=index, columns=columns)
df
df.loc['A'] = [100,100,100,100,100]
df.loc['C'] = [100,100,100,100,100]
df.loc['E'] = [100,100,100,100,100]
df

#查看重复的行
temp = df.duplicated(keep='last')
display(df,temp)

df[temp].index

df.drop(df[temp].index,axis=0)
#使用duplicated函数查看重复的行
#使用drop_duplicates()函数删除重复的行

df.drop_duplicates(keep='last')

#如果使用pd.concat([df1,df2],axis=1)生成的DataFrame,新的df中
#columns相同,使用duplicate()和drop_duplicates()就会有问题

映射

映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或字符串绑定

# replace()函数  替换元素
# map()函数  新建一列
# rename()函数  替换索引

s1 = Series(data=np.array(['dancer',1,None,3,'北京']),dtype=str)
s1

#普通替换
s1.replace(to_replace='dancer',value='DANCER')

#多值替换
s1.replace(to_replace=['dancer','北京'],value=['DANCER','首都'])

#注意:替换空值要使用中括号,不然会理解为参数是没有的
s1.replace(to_replace=[None],value='没有值')

s1[3] = 'dancer'

s2 = s1.replace({'dancer':'DANCER'})

s2[1] = 'DANCER'
s2[2] = 'DANCER'

DataFrame 替换操作

data = np.random.randint(0,150,size=(5,5))
df = DataFrame(data=data)
df.columns = list('ABCDE')

df.loc[0,'E'] = 'dancer'
df.loc[1,'D'] = 'dancer'
df

df.replace({'D':'dancer'},'DANCER')

#map() 新建一列

data = np.random.randint(0,100,size=(5,5))
index = list('ABCDE')
columns = list('甲乙丙丁戊')
df = DataFrame(data=data,index=index,columns=columns)

df['甲'] = ['dancer','lucy','lili','tom','jack']

df['申'] = [100,90,80,20,100]

map_dic = {
    'dancer':'男',
    'lucy':'女',
    'lili':'女',
    'tom':'男',
    'jack':'男'
}

df['性别'] = df['甲'].map(map_dic)
def transform_score(item):
    if item > 90:
        return 'A'
    elif item > 80:
        return 'B'
    elif item > 70:
        return 'C'
    elif item > 60:
        return 'D'
    else:
        return 'E'

#将这一列的分数映射成 ABCDE 5分制成绩
df['分数'] = df['乙'].map(transform_score)
df

df['庚'] = df['戊'].map(lambda x : x/2 +50)

#map() 可以映射新的一列数据
#map() 中可以使用lambda表达式
#map() 可以使用函数,也可以是自定义的函数
#map() 不能使用sum之类的函数,for循环
#map() 字典的键要足以匹配所有的数据,否则出现NaN

# transform()参数只能是函数,不能是字典
df['乙'].transform(transform_score)

rename()函数:替换索引

data = np.random.randint(0,150,size=(5,5))
columns = ['python','java','c','php','c#']
index = ['lucy','mery','jack','tom','rose']
df = DataFrame(data=data,columns=columns,index=index)

df.rename(index={'jack':'wuqilong'})

df.rename(columns={'python':'最好的语言','php':'还行'})

score = pd.concat((df,df),axis=1,keys=['上学期','下学期'])

#使用rename()函数替换行索引
#   map 替换所有索引
#   index  替换行索引
#   columns 替换列索引

使用聚合操作对数据异常值检测和过滤

#describe()可以查看每一辆描述性统计量
score.describe()

#std()函数可以求得df对象每列的标准差
score.std(axis=1)

#根据每列或每行的标准差,对df元素进行过滤
#借助any()或all()函数,测试是否有True

#对每列应用筛选条件,去除标准差太大的数据
df = DataFrame(data=np.random.randn(10000,3),columns=list('ABC'))
df

drop_labels = df[(np.abs(df) > 3*df.std()).any(axis=1)].index

df.drop(drop_labels,inplace=True)

df.shape

排序

# 使用take()函数排序
# 可以借用np.random.permutation()函数随机排序

data = np.random.randint(0,100,size=(5,5))
index = list('ABCDE')
columns = list('甲乙丙丁戊')
df = DataFrame(data=data,index=index,columns=columns)
df

df.take([2,1,4])

sort_random = np.random.permutation(5)

df.take(sort_random,axis=0)

随机抽样

#当DataFrame规模足够大,可以直接使用np.random.randint(),
#配合take()函数实现随机抽样

data = np.random.randn(10000,3)
df = DataFrame(data=data)
df

df.take(np.random.randint(0,10000,size=5))

数据分类处理

#数据的聚合是数据处理的最后一步,通常情况下使每一个数组生成一个单一的数值
#数据分类处理:
#    分组:先把数据分为几组
#    用函数处理:为不同组的数据应用不同的函数以便转化数据
#    合并:把不同组得到的结果数据合并起来
#数据分类处理的函数:
#    groupby() 函数
#    groups属性 可以查看分组的情况

df = DataFrame({
    'item':['苹果','香蕉','橘子','香蕉','橘子','苹果'],
    'price':[4,3,3,2,2.5,4],
    'color':['red','yellow','yellow','green','green','green'],
    'weight':[12,20,50,30,20,44]    
})
df

df.groupby('item').sum()['weight']

df.groupby('color').mean()['price']

df.groupby(['color','item']).mean()['price']

df.groupby('price').groups

df.groupby('item').groups

total = df.groupby('item')['weight'].sum()

total = DataFrame(total)

total.reset_index(inplace=True)
total

result = pd.merge(df,total,on='item',suffixes=['','_total']).rename(columns={
    'weight_total':'total'})
result

"""
练习:假设菜市场张大妈在卖菜,有以下属性:
    菜品(item):萝卜,白菜,辣椒,冬瓜
    颜色(color):白色,青色,红色
    重量(weight)
    价格(price)
    
1.以属性为列索引,创建一个DataFrame对象df
2.对df进行聚合操作,求出颜色为白色的价格总和
3.对df进行聚合操作,求出各菜品的所有重量以及平均价格
4.使用merge合并总重量及其平均价格
"""
data = {
    'item':['萝卜','萝卜','白菜','辣椒','白菜','辣椒','冬瓜','萝卜'],
    'color':['white','red','white','red','green','green','green','green'],
    'price':[2,1.5,2,1,4,3,5,8],
    'weight':[100,50,30,20,40,50,60,40]
}
df = DataFrame(data=data)
df

df.groupby('color')['price'].sum().loc['white']

total_weight = DataFrame(df.groupby('item')['weight'].sum())
total_weight

def my_mean(items):
    m = 0
    for item in items:
        m += item
    return m/len(items)

mean_price = DataFrame(df.groupby('item')['price'].apply(my_mean))

table1 = pd.merge(df,mean_price,left_on='item',right_index=True,
                  suffixes=['','_mean']).rename(columns={
 'price_mean':'mean'})

table2 = pd.merge(table1,total_weight,left_on='item',
                 right_index=True,suffixes=['','_sum']).rename(columns={
    'weight_sum':'total'
})

高级数据聚合

#除了使用groupby分组后,我们也可以使用transform和apply提供
#实现自定义函数更多的运算

#传入一个数组
def my_sum(items):
    s = 0
    for item in items:
        s += item
    return s

df.groupby('item')['price'].sum()

df.groupby('item')['price'].apply(my_sum)

df.groupby('item')['price'].mean()

mean_price = DataFrame(df.groupby('item')['price'].apply(my_mean))

pd.merge(df,mean_price,left_on='item',right_index=True)

def my_test(items):
    s = 0
    for i in items:
        s += i
    return s

mean_p = DataFrame(df.groupby('item')['price'].transform(my_test))
mean_p.columns = ['mean']
pd.concat((df,mean_p),axis=1)















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值