pandas-数据处理

pandas数据处理

1、删除重复元素

重复行判断

df.duplicated() # 重复行 显示为True,其他False (重复行第一次出现不为重复)

  • keep : 默认first 从前往后看, last 从后往前看 (重复出现的行)

  • subset=['B','C','D'] 默认对整行判断, 可指定列索引 # 表示有B, C, D重复的行,显示True

删除重复行

df.drop_duplicates() # 删除重复行

df[df.duplicated()] # 显示重复行数据

df[np.logical_not(df.duplicated())] 显示不重复的行数据 # 方法1

df[~df.duplicated()] # 方法2 取反

 

2. 映射

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

需要使用字典:

包含三种操作:

  • replace()函数:替换元素

  • 最重要:map()函数:新建一列

  • rename()函数:替换索引

(1) replace()函数:替换元素

dic = {10:100,4:104,6:106}

ddd.replace(dic)   # 将DataFrame中 10,4,6 替换为字典中映射的数据100,104,106

ddd.replace([10,6], method='ffill', limit=1)   # 指定替换方式

替换NaN元素

ddd = ddd.astype(np.float64)
ddd.iloc[0,1] = np.nan
ddd.replace({np.nan:0.0})

(2) map()函数:新建一列

  • 使用map()函数,由已有的列生成一个新列, 适合处理某一单独的列。

  • 仍然是新建一个字典, map()函数中可以使用lambda函数

传一个映射的字典

df['python'] = df['语文'].map({72:100,107:110,28:120}) # 由已有的列生成一个新列

map()函数中可以使用lambda函数

df['java'] = df['英语'].map(lambda x:x*2)

传一个自定义函数

def score(s):
  if s<90:
      return 'failed'
  elif s>120:
      return 'excellent'
  else:
      return 'pass'
df['English_score'] = df['英语'].map(score)

可以修改已有数据

df['数学'] = df['数学'].map({55:100, 66:120, 77:130})

transform()和map()类似

df['php'] = df['英语'].transform(lambda x:x*2)

区别: map() 一次传递一个数据,传完一列; transform 传递整个列

(3) rename()函数:替换索引

仅传字典,需指定axis

df.rename({'张三':'张十三','李四':'李十四','王五':'王老五'},axis=1)

替换行索引

df.rename(index = {'张三':'张十三','李四':'李十四','王五':'王老五'})

替换列索引

df.rename(columns={'语文':'chese','数学':'math','英语':'English','python':'py'})

 

3. 异常值检测和过滤

  • 使用describe()函数查看每一列的描述性统计量

    df.describe()

    包括: count: 数据个数 mean: 平均值 std: 标准差

    min: 最小值 max: 最大值 等等

    df.info() 查看DataFrame信息

  • 使用std()函数可以求得DataFrame对象每一列的标准差

  • 根据每一列的标准差,对DataFrame元素进行过滤。

  • 借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False

  • 对每一列应用筛选条件,去除标准差太大的数据

  • 删除特定索引df.drop(labels,inplace = True), 或 df[~cond]

# 一个形状为10000*3的标准正态分布的DataFrame(np.random.randn),去除掉所有满足以下情况的行:其中任一元素绝对值大于3倍标准差

df = DataFrame(np.random.randn(10000,3))
df.abs()  # 每个元素绝对值
# 判断异常数据.
# 去除掉所有满足以下情况的行
# 大于三倍标准偏差
cond = (df.abs() > df.std()*3).any(axis=1)
df[cond]   # 存在大于三倍标准偏差元素的异常行
df[~cond]  # 取反, 去掉异常的行

 

4. 排序

  • 使用.take()函数排序

    df.take([3,2,1]) # 指定行排序

    df.take([2,1,0],axis=1) # 指定列排序

  • 可以借助np.random.permutation()函数随机排序

    有放回的随机抽样.

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

    无放回的随机抽样.

    df.take(np.random.permutation([0,1,2]))

 

5. 数据聚合【重点】

数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。

数据分类处理:

  • 分组:先把数据分为几组

  • 用函数处理:为不同组的数据应用不同的函数以转换数据

  • 合并:把不同组得到的结果合并起来

数据分类处理的核心: groupby()函数

1, 分组, groupby

df.groupby(by='color')

2, 调用聚合 函数,

df.groupby(by='color').sum()[['price']] # 会先计算所有列

df.groupby(by='color')[['price']].sum() # 先取列再聚合. 计算少,性能更佳, 推荐写法.

3, 把聚合的结果追加到原始数据表.使用 pd.merge() 合并

pd.merge(df, price_sum, left_on='color', right_index=True, suffixes=['', '_sum'])

使用add_prefix(), add_suffix() 给聚合的数据修改列名

df.groupby(by='color').sum()[['price']].add_prefix('mean_')

df.groupby(by='color').sum()[['price']].add_suffix('_mean')

可以使用transform和apply实现相同功能

在transform或者apply中传入函数名即可

df.groupby(by='color').sum()[['price']] .transform(sum)

df.groupby(by='color').sum()[['price']] .apply(sum) # 会将字符串也相加

 

posted @ 2019-11-24 11:16  Deaseyy  阅读(407)  评论(0编辑  收藏  举报