暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Pandas使用总结(三):数据处理

一叶扁舟 2020-06-28
3095

image.png

本节总结pandas数据处理的操作,数据处理是pandas是最核心的功能,可以高效快捷地批量处理数据。类似于Excel中的数据清洗。

一、数据清洗
  • 缺失值处理
    • 检查缺失值
df.isnull().sum(axis=0) # 查看每列缺失值个数
df['A'].isnull() # 查看缺失值,是返回True,不是返回False
df.shape[0] - df.isnull().sum(axis=0) # 查看每列非缺失值个数

df.isna().sum() # 查看各列缺失值数
df.isna().mean()# 查看各列缺失值所占百分比
    • 删除
df.dropna(axis=0) # 删除存在缺失值的行
df[~df['A'].isin([np.nan, None])] # 删除某列存在缺失值的行
df.dropna(axis=0, how='all') # 删除该行全部为缺失值的行
df.dropna(axis=0, thresh=10) # 删除非空值少于10个的行

df.dropna(axis='colimns')#删除含有缺失数据的列
df.dropna(thresh=len(df)*0.9, axis='colimns')#删除缺失数据占总体超过10%的列
    • 填充
# 固定值填充
df.fillna(5)
df.fillna({'A': 5, 'B': 6})
# 邻近值填充
df.fillna(method='ffill') # 用上面最近且不为nan的值填充
df.fillna(method='bfill') # 用下面最近且不为nan的值填充
# 统计值填充
df.fillna(df.maen())
df.fillna(df.max())
    • 转换
# NaN转换为None
df.where(pd.notnull(df), None)

  • 重复值处理
    • 查看重复值
df.duplicated(['A', 'B']).value_counts() # 查看重复值个数
df[df.duplicated()] # 查看重复值的第一条
    • 处理重复值
# 根据A, B列去重,保留第一行(first/last)
df.drop_duplicates(subset=['A', 'B'], keep='first')

  • 异常值处理(空格)
    • 清除空格
# 去除前后空格
df['A'] = df['A'].str.strip()
    • 查看异常值
# 使用箱线图检查异常值
sns.boxplot(y=data)
sns.stripplot(y=data, color='orange', jitter=0.2, size=2.5)
    • 清除异常值
# 使用正态分布2倍标准差去除异常值
up = data.mean() + 2 * data.std()
down = data.mean() - 2 * data.std()
data = data.loc[(data > down) & (data < up)]
# 使用四分位数IQR去除异常值
q1 = data.quantile(q=0.25)
q3 = data.quantile(q=0.75)
up = q3 + 1.5 * (q3 - q1)
down = q1 - 1.5 * (q3 - q1)
data = data.loc[(data > down) & (data < up)]


二、数据转换
  • 索引设置
    • 添加/重命名索引
# 添加(全部重命名)索引
df.columns = ['A', 'B']
df.index = ['a', 'b']
# 部分重命名
df.rename(columns={'A': 'a', 'B': 'b'}, index={1: 11, 2: 22})
    • 重置索引
 # 指定A, B列为索引列,原来的索引变为列
df.reset_index(drop=False) # 重置为默认索引, 原来的索引变为列
    • 索引去重
# 输出去重后的索引
df.index.unique()
    • 复合索引
# 创建复合索引
df.set_index(['A', 'B'], drop=False)
# 复合索引取值
df.loc['外层索引'] # 得到dsf类型
df.loc['外层索引'].loc['内层索引'] # 得到series
# 内外层索引交换
df.swaplevel()
# 恢复单索引
df.reset_index(level=0, drop=False) # 外层仍为索引,内层恢复为列

  • 数据类型及转换
    • 查看数据类型
# 查看数据类型
df.dtypes
    • 数据类型转换
# 数据类型转换:int64/int32/float64/float32/object/datetime64/str
df.astype('int64)
df.astype({'列1':'float','列2':'float'})
    • 常见数据类型操作
# 字符串(使用.str.字符串的任何方法,但是注意nan会变成字符串,记得替换回来)
df['A'].astype('str').str.strip().replace('nan', np.nan) #去除空格

# 数值
df.round(2) # 保留两位小数
df.round({'A': 1, 'B': 0}) # A列保留1位,B列保留0位(0位也还是小数类型)

# 时间
df['time'] = pd.to_datetime(df['time'], '%Y-%m-%d') # 字符串转化为时间
df['年月'] = df['time'].dt.strftime('%Y-%m') # 时间变为字符串

  • 形状重构
df.values.reshape([3, 2]) # 转化为3行两列的数组

df.to_dict(orient='dict') # {'a': {}, 'b': {}}
df.to_dict(orient='list') # {'a': [], 'b': []}
df.to_dict(orient='series') # {'a': 1, 'b': 2}
df.to_dict(orient='records') # [{}, {}, {}]

[tuple(x) for x in df.values] # [(), (), ()]

  • 排序
    • 排序
# 按值排序(按score升序,按age降序,nan排在最前面(默认最后面))
df.sort_values(by=['score', 'age'], ascending=[True, False], na_position='first')
# 按索引排序(升序)
df.sort_index(ascending=True)
    • 排行
# 中国式排名(从大到小,值相同排名相同,排名连续)
df['rank'] = df['score'].rank(ascending=False, method='dense')


三、数据拆分(分列)
  • 字符串字段拆分
# 按位置拆分拆分
df['A'] = df['A'].str.slice(0, 3) # [0, 3)
# 按分隔符拆分
df['A'] = df['A'].str.split('_', expand=True)

  • 列表字段拆分
# 列表字段拆分
df_new = df['A'].apply(pd.Series)
pd.concat([df, df_new], axis='columns')

  • 时间字段拆分
# 时间字段拆分(year/month/weekday/day/hour/minute/second)
df['year'] = df['time'].dt.year


四、数据合并
  • 合并字段
# 合并字段
df['name_score'] = df['name'] + '_' + df['score']

  • 合并记录
# 合并记录(axis=0上下拼接;ignore重置索引;缺失值自动填充为nan)
pd.concat([df1, df2], axis=0, ignore_index=True)

  • 关联合并(sql:join excel:vlookup)
# 关联合并(how:left/right/inner/outer)
pd.merge(df1, df2, how='left', on='name')

pd.merge(df1, df2, how='left', left_on='name', right_on='name2') # 两表关联字段名不同
pd.merge(df1, df2, how='left', left_on=True, right_on=True) # 把索引当作连接条件
pd.merge(df1, df2, how='left', on=['name', 'name2']) # 根据两个字段关联

五、数据抽取
  • 抽取某列中的数字(extract支持正则表达式)
data['evaluate'] = data['evaluate'].str.extract(r'(\d+)', expand=True).astype('int64')

最后修改时间:2020-07-08 18:35:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论