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

来源:互联网 发布:哪家券商服务好 知乎 编辑:程序博客网 时间:2024/06/10 14:26
# 移除重复项data = DataFrame({'k1':['one'] * 3 +['two'] * 4,                  'k2':[1,1,2,3,3,4,4]})datadata.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) # 先将其全部转成小写格式datadata['food'].map(lambda x:meat_to_animal[x.lower()]) # 使用lambda表达式做相同内容的工作# 替换值data = Series([1.,-999,2,-999,-1000,3])datadata.replace(-999,np.nan) # 将-999替换成一个缺失值,产生的是一个新的Seriesdata.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的轴标签datadata.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 按照分位数来进行面元的划分这里是按照四分位数进行切割catspd.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)samplerdfdf.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
原创粉丝点击