Pandas - 数据规整化

本文详细介绍了Pandas中数据规整化的关键操作,包括使用merge进行内连、外连、左连、右连,Series的concat()与combine_first()方法,层次化索引的处理,数据的去重、转换、拆分以及异常值检查。通过这些技巧,可以高效地整理和清洗数据。


1 数据规整化-合并数据集

1.1 merge的内连,外连,左连,右连

  • merge默认采用的是“inner连结”,取交集部分,没有交集的会舍弃掉
  • 如果没指定用哪列连结,默认情况下merge会将重叠列的列名当做健,一般建议用 on 指定一下
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
from numpy import nan as NA
df1 = DataFrame({
  
  'key':['b','b','a','c','a','a','b'],
               'data1':range(7)})
df2 = DataFrame({
  
  'key':list('abd'),
               'data2':range(3)})
pd.merge(df1,df2)
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
pd.merge(df1,df2,on='key')#默认how='inner'
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
pd.merge(df1,df2,on='key',how='outer')
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
data1 key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0
  • how=left , 取merge连结的左边数据集,右边只在取有关联的,没关联的NAN值填充
  • how=right , 取merge连结的右边数据集,左边只在取有关联的,没关联的NAN值填充
df5 = DataFrame({
  
  'key':['b','b','a','c','a','a'],
               'data1':range(6)})
df6 = DataFrame({
  
  'key':list('ababd'),
               'data2':range(5)})
pd.merge(df1,df2,on='key',how='left')
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
data1 key data2
0 0 b 1.0
1 1 b 1.0
2 2 a 0.0
3 3 c NaN
4 4 a 0.0
5 5 a 0.0
6 6 b 1.0
df5 = DataFrame({
  
  'key':['b','b','a','c','a','a'],
               'data1':range(6)})
df6 = DataFrame({
  
  'key':list('ababd'),
               'data2':range(5)})
pd.merge(df1,df2,on='key',how='right')
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
data1 key data2
0 0.0 b 1
1 1.0 b 1
2 6.0 b 1
3 2.0 a 0
4 4.0 a 0
5 5.0 a 0
6 NaN d 2

如果两个对象的列名不同,也可以分别进行指定

df3 = DataFrame({
  
  'lkey':['b','b','a','c','a','a','b'],
               'data1':range(7)})
df4 = DataFrame({
  
  'rkey':list('abd'),
               'data2':range(3)})
pd.merge(df3,df4,left_on='lkey',right_on='rkey')
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
data1 lkey data2 rkey
0 0 b 1 b
1 1 b 1 b
2 6 b 1 b
3 2 a 0 a
4 4 a 0 a
5 5 a 0 a

merge方法总结

'''
pd.merge(df1,df2,on/left_on,right_on,how='')
on:
    指定进行连接的列名,不指定默认将重叠列的列名当做健
left_on,right_on:
    没有相同列名时使用这两个参数指定连接列名
how='':
    (1) inner    内连接   内链接,取交集(默认连接方法)
    (2) outer    外连接   取并集
    (3) left     左连接   以df1为主"表"进行链接
    (4) right    右链接   以df2为主"表"进行链接

'''

1.2 Series的数据连接

1.2.1 concat()

  • concat默认在垂直方向上进行连接,axis=0,构造hierarchical index的Series
  • axis=1,将Series在水平方向上从左到右进行链接,行索引取所有需要链接的Series的索引并集,生成一个DataFrame
  • 在concatenate的时候可以指定keys,这样可以给
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值