Pandas函数之数据筛选与清洗函数

文章目录

      • 数据筛选函数
      • 数据清洗函数
        • 拼接
          • concat
          • merge
          • join
        • 缺失值、重复值处理
        • str & dt

数据筛选函数

函数 解释
loc 根据行列名筛选数据,第一个参数是行名,第二个参数是列名
iloc 根据行列号筛选数据,第一个参数是行号,第二个参数是列号
isin() 传入一个列表,判断DadaFrame或者Series是否包含列表中的元素
between() 筛选区间内的数据,只能作用于Series
unique() 筛选不重复的数据(去重),只能作用于Series
nlargest() 筛选前n个最大的数据,只能作用于Series
nsmallest() 筛选前n份最小的数据,只能作用于Series
student = {
    '学号':['001','002','003','004','005','006','007','008','009','010'],
    '语文':[103,99,111,87,121,132,114,100,107,101],
    '数学':[88,92,145,78,111,120,66,99,112,103],
    '英语':[127,100,99,46,68,98,88,111,102,93],
    '理综':[203,199,236,198,222,276,183,193,231,198]
}
# 不显示科学计数法,小数点后保留两位小数
pd.set_option('display.float_format', lambda x: '%.2f' % x)
df = pd.DataFrame(student)
from copy import deepcopy
df1 = deepcopy(df)
df1.index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k']
学号 语文 数学 英语 理综
a 001 103 88 127 203
b 002 99 92 100 199
c 003 111 145 99 236
d 004 87 78 46 198
e 005 121 111 68 222
f 006 132 120 98 276
g 007 114 66 88 183
h 008 100 99 111 193
j 009 107 112 102 231
k 010 101 103 93 198
# loc,根据行列名筛选数据
df1.loc['b', '学号']

Out[9]:
'002'
# iloc,根据行列号筛选数据
df1.iloc[1]
# 
Out[10]:
学号    002
语文     99
数学     92
英语    100
理综    199
Name: b, dtype: object
# isin(),是否包含列表内的元素
df1.isin([198,11])
# between(),筛选区间内的元素,注意是左右都闭的区间
df1[df1['数学'].between(100,130)]

Out[14]:

	学号	语文	数学	英语	理综
e	005	 121   111	68	 222
f	006	 132   120	98   276
j   009  107   112  102  231
k	010  101   103  93   198
# unique(),筛选不重复的数据,返回ndarray
df1['理综'].unique()

Out[12]:
array([203, 199, 236, 198, 222, 276, 183, 193, 231], dtype=int64)
# nlargest(),返回前n个最大的元素
df1['数学'].nlargest(3)

Out[16]:
c    145
f    120
j    112
Name: 数学, dtype: int64
# nsmallest(),返回前n个最小的元素
df1['数学'].nsmallest(3)

Out[21]:
g    66
d    78
a    88
Name: 数学, dtype: int64

数据清洗函数

拼接

函数
merge 根据共同列或者索引进行合并,可以取内连接,左连接、右连接、外连接等,类似sql中join操作
join 主要用于以索引作为连接键来合并对象
concat 根据索引进行行或列的拼接,只能取行或列的交集或并集
append 相当于concat的垂直拼接
student = {
    '学号':['011','012','013','014','015'],
    '语文':[111,109,94,121,87],
    '数学':[88,92,145,78,103],
    '英语':[68,98,88,111,102],
}
df2 = pd.DataFrame(student)
concat

常用参数说明

参数 说明
objs 必须要传入的参数,参与连接的对象
axis 拼接的方向(轴),默认为0。0表示按行拼接,即垂直拼接;1表示按列拼接,即水平拼接
join 有两个可选值:‘inner’(取交集)、‘outer’(取并集),表示其他轴向上的索引取交集还是并集,默认为’outer’
ignore_index 不保留原来的索引,生成新的索引,默认为False
sort 是否需要排序,默认None,若是垂直拼接时,需指明Ture or False
  • 垂直拼接
pd.concat([df, df2],sort=False)
学号 语文 数学 英语 理综
0 001 103 88 127 203.00
1 002 99 92 100 199.00
2 003 111 145 99 236.00
3 004 87 78 46 198.00
4 005 121 111 68 222.00
5 006 132 120 98 276.00
6 007 114 66 88 183.00
7 008 100 99 111 193.00
8 009 107 112 102 231.00
9 010 101 103 93 198.00
0 011 111 88 68 nan
1 012 109 92 98 nan
2 013 94 145 88 nan
3 014 121 78 111 nan
4 015 87 103 102 nan
  • 水平拼接
pd.concat([df, df2], axis=1)
学号 语文 数学 英语 理综 学号 语文 数学 英语
0 001 103 88 127 203 011 111.00 88.00 68.00
1 002 99 92 100 199 012 109.00 92.00 98.00
2 003 111 145 99 236 013 94.00 145.00 88.00
3 004 87 78 46 198 014 121.00 78.00 111.00
4 005 121 111 68 222 015 87.00 103.00 102.00
5 006 132 120 98 276 NaN nan nan nan
6 007 114 66 88 183 NaN nan nan nan
7 008 100 99 111 193 NaN nan nan nan
8 009 107 112 102 231 NaN nan nan nan
9 010 101 103 93 198 NaN nan nan nan
  • 去除原索引
pd.concat([df, df2], ignore_index=True, sort=False)
学号 语文 数学 英语 理综
0 001 103 88 127 203.00
1 002 99 92 100 199.00
2 003 111 145 99 236.00
3 004 87 78 46 198.00
4 005 121 111 68 222.00
5 006 132 120 98 276.00
6 007 114 66 88 183.00
7 008 100 99 111 193.00
8 009 107 112 102 231.00
9 010 101 103 93 198.00
10 011 111 88 68 nan
11 012 109 92 98 nan
12 013 94 145 88 nan
13 014 121 78 111 nan
14 015 87 103 102 nan
  • inner方式
pd.concat([df, df2], axis=1, join='inner')
学号 语文 数学 英语 理综 学号 语文 数学 英语
0 001 103 88 127 203 011 111 88 68
1 002 99 92 100 199 012 109 92 98
2 003 111 145 99 236 013 94 145 88
3 004 87 78 46 198 014 121 78 111
4 005 121 111 68 222 015 87 103 102
merge

常用参数说明

参数 说明
left 参与连接的左侧对象
right 参与连接的右侧对象
how 连接的方式,可选参数有:‘inner’:内连接、‘outer’:外连接、‘left’:‘左外连接’、‘right’:‘右外连接’
on 指明连接的列名,必须是两边都存在的列名。如果未指明,且其他连接键也未指定,则以left和right列名的交集作为连接键
left_on 左侧DataFrame中用作连接键的列
right_on 右侧DataFrame中用作连接键的列
left_index 将左侧的行索引用作其连接键,默认False
right_index 类似于left_index
sort 根据连接键对合并后的数据进行排序,默认False
suffixes 字符串值元组,用于追加到重叠列名的末尾,默认为('_x','_y')。

参考资料:https://blog.csdn.net/Asher117/article/details/84725199

  • 基于相同列名的连接
pd.merge(df, df2,on=['数学'])
学号_x 语文_x 数学 英语_x 理综 学号_y 语文_y 英语_y
0 001 103 88 127 203 011 111 68
1 002 99 92 100 199 012 109 98
2 003 111 145 99 236 013 94 88
3 004 87 78 46 198 014 121 111
4 010 101 103 93 198 015 87 102
  • 基于不同列名连接(当列名不同,意义相同时,可采用此方案)
pd.merge(df, df2, left_on=['数学'], right_on=['语文'])
学号_x 语文_x 数学_x 英语_x 理综 学号_y 语文_y 数学_y 英语_y
0 005 121 111 68 222 011 111 88 68
  • 外连接
pd.merge(df, df2, how='outer')
学号 语文 数学 英语 理综
0 001 103 88 127 203.00
1 002 99 92 100 199.00
2 003 111 145 99 236.00
3 004 87 78 46 198.00
4 005 121 111 68 222.00
5 006 132 120 98 276.00
6 007 114 66 88 183.00
7 008 100 99 111 193.00
8 009 107 112 102 231.00
9 010 101 103 93 198.00
10 011 111 88 68 nan
11 012 109 92 98 nan
12 013 94 145 88 nan
13 014 121 78 111 nan
14 015 87 103 102 nan
  • 左连接
pd.merge(df, df2, how='left')
学号 语文 数学 英语 理综
0 001 103 88 127 203
1 002 99 92 100 199
2 003 111 145 99 236
3 004 87 78 46 198
4 005 121 111 68 222
5 006 132 120 98 276
6 007 114 66 88 183
7 008 100 99 111 193
8 009 107 112 102 231
9 010 101 103 93 198
  • 使用索引连接
df2.index = df2.index+100
pd.merge(df, df2, left_on='数学', right_index=True)
数学 学号_x 语文_x 数学_x 英语_x 理综 学号_y 语文_y 数学_y 英语_y
9 103 010 101 103 93 198 014 121 78 111
join

常用参数说明

参数 说明
other 右边的对象
on 如果右表的索引值正是左表的某一列的值,变会将对应的索引与列名作为连接值去合并
how 与merge中how意义一样,默认为left
lsuffix 左后缀,若两个表有相同列名时必须要指明
rsuffix 同rsuffix
sort 与merge中sort意义一样
# 默认以索引作为连接键合并
df2.index = df2.index-100
df.join(df2, lsuffix='_l',  rsuffix='_r', how='inner')
学号_l 语文_l 数学_l 英语_l 理综 学号_r 语文_r 数学_r 英语_r
0 001 103 88 127 203 011 111 88 68
1 002 99 92 100 199 012 109 92 98
2 003 111 145 99 236 013 94 145 88
3 004 87 78 46 198 014 121 78 111
4 005 121 111 68 222 015 87 103 102

缺失值、重复值处理

函数 解释
duplicated() 元素是否有重复
drop_duplicates() 删除重复值
isnull() 元素是否缺失
dropna() 删除缺失值
fillna() 填充缺失值
ffill() 使用缺失值前一个元素进行填充
bfill() 使用缺失值后一个元素填充
notnull() 元素是否不缺失
drop() 删除列或行
df4 = df.append(df2,ignore_index=True)
df4.loc[15] = ['010',103,198,93,101]
学号 数学 理综 英语 语文
0 001 88 203.00 127 103
1 002 92 199.00 100 99
2 003 145 236.00 99 111
3 004 78 198.00 46 87
4 005 111 222.00 68 121
5 006 120 276.00 98 132
6 007 66 183.00 88 114
7 008 99 193.00 111 100
8 009 112 231.00 102 107
9 010 103 198.00 93 101
10 011 88 nan 68 111
11 012 92 nan 98 109
12 013 145 nan 88 94
13 014 78 nan 111 121
14 015 103 nan 102 87
15 010 103 198.00 93 101
  • 重复值
# 不指定列,就是判断整行是否重复
df4.duplicated()

Out[68]:
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
15     True
dtype: bool
# 删除重复行
df4.drop_duplicates(inplace=True)
学号 数学 理综 英语 语文
0 001 88 203.00 127 103
1 002 92 199.00 100 99
2 003 145 236.00 99 111
3 004 78 198.00 46 87
4 005 111 222.00 68 121
5 006 120 276.00 98 132
6 007 66 183.00 88 114
7 008 99 193.00 111 100
8 009 112 231.00 102 107
9 010 103 198.00 93 101
10 011 88 nan 68 111
11 012 92 nan 98 109
12 013 145 nan 88 94
13 014 78 nan 111 121
14 015 103 nan 102 87
  • 缺失值
# 是否有缺失值 
df4['理综'].isnull()

Out[83]:
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10     True
11     True
12     True
13     True
14     True
15    False
Name: 理综, dtype: bool
# 删除缺失值
df4['理综'].dropna()

Out[101]:
0   203.00
1   199.00
2   236.00
3   198.00
4   222.00
5   276.00
6   183.00
7   193.00
8   231.00
9   198.00
Name: 理综, dtype: float64
  • 删除列或行
"""
做数据分析时,某一列或行缺失值或异常值过多时,可以考虑将此列或行删除掉
"""
df4.drop(['理综'], axis=1)
学号 数学 英语 语文
0 001 88 127 103
1 002 92 100 99
2 003 145 99 111
3 004 78 46 87
4 005 111 68 121
5 006 120 98 132
6 007 66 88 114
7 008 99 111 100
8 009 112 102 107
9 010 103 93 101

str & dt

data = {
    'name':['张三','李四','王五'],
    'city':['广东省&深圳市','湖北省&仙桃市','山西省&吕梁市'],
    'birth':['2018-06-20','1995-07-11','2014-10-09']
}
df5 = pd.DataFrame(data)
name city birth
0 张三 广东省&深圳市 20/06/2018
1 李四 湖北省&仙桃市 11/07/1995
2 王五 山西省&吕梁市 09/10/2014
  • str

相当于将数据转化为 string,进而可以使用string的一些方法

# 将city列中的&去除
df5['city'] = df5['city'].str.replace('&','')
name city birth
0 张三 广东省深圳市 2018-06-20
1 李四 湖北省仙桃市 1995-07-11
2 王五 山西省吕梁市 2014-10-09
  • dt

用于日期处理,在使用dt之前,必须要使用to_datetime方法将数据转换成时间格式

日期处理的常用函数

函数 解释
dt.date 日期值,年-月-日
dt.time 时间,时分秒
dt.year
dt.month
df.day
dt.hour 小时
dt.minute 分钟
dt.second
dt.quarter 季度
dt.weekday 星期几,阿拉伯数字(0到6)
dt.weekday_name 星期几,英文
dt.week 一年中的第几周
dt.dayofyear 一年中的第几天
dt.days_in_month 当月最大天数
dt.is_mouth_start 是否为当月的第一天
dt.is_mouth_end 是否为当月的最后一天
dt.is_quarter_start 是否为当季度的第一天
dt.is_quarter_end 是否为当季度的最后一天
dt.is_year_start 是否为当年的第一天
dt.is_year_end 是否为当年的最后一天
dt.is_leap_year 是否为闰年
pd.to_datetime(df5['birth'],format="%d/%m/%Y")

Out[132]:
0   2018-06-20
1   1995-07-11
2   2014-10-09
Name: birth, dtype: datetime64[ns]
        
pd.to_datetime(df5['birth'], format="%d/%m/%Y").dt.weekday_name

Out[133]:
0    Tuesday
1     Sunday
2     Monday
Name: birth, dtype: object

你可能感兴趣的:(数据分析,python,pandas,筛选,清洗,合并)