利用Python数据分析:数据规整化(四)

# 移除重复项
data = DataFrame({'k1':['one'] * 3 +['two'] * 4,
                  'k2':[1,1,2,3,3,4,4]})
data
data.duplicated() # 返回一个布尔类型的Series来表示各行是否为重复行  (duplicated adj.	复制出的,复写书的)
data.drop_duplicates() # 丢弃掉重复的行
data['v1'] = range(7)
data.duplicated(['k1']) # 指定部分列进行重复判断
data.drop_duplicates(['k1']) # 根据某一列进行过滤重复项
data.drop_duplicates(['k1','k2'],take_last = True) #duplicated和drop_duplicates默认保留的是一个出现的值,可以指定为最后一个
# 利用函数或者映射进行数据转换 (根据数组、Series或者DataFrame列中的值来实现转换工作
data = DataFrame({'food':['bacon','pulled pork','bacon','Pastrami',
                          'corned beef','Bacon','pastrami','honey ham','nova lox'],
                  'ounces':[4,3,12,6,7.5,8,3,5,6]})
data
# 添加一列来表示肉类食物来源的动物类型
meat_to_animal = {
    'bacon':'pig',
    'pulled pork':'pig',
    'pastrami':'cow',
    'corned beef':'cow',
    'honey ham':'pig',
    'nova lox':'salmon'
} # 先编写一个肉类到动物的映射
# Series的map方法可以接受一个函数或者含有映射关系的字典型对象
data['animal'] = data['food'].map(str.lower).map(meat_to_animal) # 先将其全部转成小写格式
data
data['food'].map(lambda x:meat_to_animal[x.lower()]) # 使用lambda表达式做相同内容的工作
# 替换值
data = Series([1.,-999,2,-999,-1000,3])
data
data.replace(-999,np.nan) # 将-999替换成一个缺失值,产生的是一个新的Series
data.replace([-999,-1000],np.nan) # 传入一个列表一次替换多个值
data.replace([-999,-1000],[np.nan,0]) # 使用两个列表来对不同的值替换成不同的值
data.replace({-999:np.nan,-1000:0}) # 传入的参数也可以是字典
# 重命名轴索引
data = DataFrame(np.arange(12).reshape((3,4)),
                 index=['Ohio','Colorado','New York'],
                 columns=['one','two','three','four'])
data.index.map(str.upper) # 使用map方法来把标签大写
data.index  = data.index.map(str.upper) # 通过赋值的方法就地修改Dataframe的轴标签
data
data.rename(index=str.title,columns=str.upper) # 使用rename方法修改的是副本
data.rename(index={'OHIO':'INDIANA'},
            columns={'three':'peekaboo'}) # 结合字典型对象实现对部分轴标签的更新
_ = data.rename(index={'OHIO':'INDIANA'},inplace=True) # 想要就地修改只要传入inplace = T即可
data
# 离散化和面元的划分
ages = [20,22,25,27,21,23,37,31,61,45,41,32]
bins = [18,25,35,60,100] # 按照18~25 25~35 35~60 60~100  的区间进行划分
cats = pd.cut(ages,bins)
cats # 返回的是一个特殊的Categorical对象,可以看成一个表示面元名称的字符串
cats.labels # 表示所对应的元素属于哪个区间
cats.levels # 显示所划分的区间
pd.value_counts(cats) #  计算每个区间的数量
pd.cut(ages,[18,26,36,61,100],right=False) # 修改为左边为开区间,右边为闭区间
group_names = ['Youth','YoungAdult','MiddleAged','Senior'] # 自己定义分组的名字
pd.cut(ages,bins,labels=group_names) # 使用labels标签来设定
data = np.random.rand(20) # 生成一个随机数
pd.cut(data,4,precision=2) # 传入的可以是面元的数量而不是确定的便捷这时候会根据数据的最大最小值计算等长的面元
# precision adj.	精确的,准确的,细致的; 严守标准的; 行动精确的;
data = np.random.randn(1000) # 正态分布
cats = pd.qcut(data,4) # qcut 按照分位数来进行面元的划分这里是按照四分位数进行切割
cats
pd.value_counts(cats)
pd.qcut(data,[0,0.1,0.5,0.9,1]) # 设置指定的分位数 包含端点
pd.value_counts(pd.qcut(data,[0,0.1,0.5,0.9,1]))
# 检测和过滤异常值
np.random.seed(12345)
data = DataFrame(np.random.randn(1000,4))
data.describe # 整个数据的概览
col = data[3] # 找出某列绝对值>3的值
col[np.abs(col) > 3]
data[(np.abs(data) > 3).any(1)] # 选出全部含有超过3或者-3的值的行
data[np.abs(data)> 3] = np.sign(data) *3 # 将值限制在【-3,3】
data.describe
# 排列和随机采样
df = DataFrame(np.arange(5 * 4).reshape(5,4))
sampler = np.random.permutation(5)
sampler
df
df.take(sampler) # 随机重排列
df.take(np.random.permutation(len(df))[:3])
bag = np.array([5,7,-1,6,4])
sampler = np.random.randint(0,len(bag),size=10)
sampler # 使用randint得到一组随机整数
draws = bag.take(sampler)
draws

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值