一.pandas数据处理
1.删除重复元素
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
def mk_df(inds, cols):
data = {col: [col + str(i) for i in inds] for col in cols}
return DataFrame(data=data, index=inds, columns=cols)
- 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
df1 = mk_df([1,2,3,4], list('ABCD'))
df1
输出:
A B C D
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
# 生成重复行
df1.loc[1] = df1.loc[2]
df1
输出:
A B C D
1 A2 B2 C2 D2
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
# 使用duplicated检查是否有重复的行
df1.duplicated()
输出:
1 False
2 True
3 False
4 False
dtype: bool
# keep 从后往前检查是否有重复行
df1.duplicated(keep='last')
输出:
1 True
2 False
3 False
4 False
dtype: bool
- 使用drop_duplicates()函数删除重复的行
df1.drop_duplicates(keep='last')
输出:
A B C D
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
2.映射
映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
需要使用字典:
map = {
'label1':'value1',
'label2':'value2',
...
}
包含三种操作:
- replace()函数:替换元素
- 最重要:map()函数:新建一列
- rename()函数:替换索引
1) replace()函数:替换元素
使用replace()函数,对values进行替换操作
data = np.random.randint(0,150,size=(4,4))
index = ['张三', '李四', '王五', '赵六']
columns = ['语文', '数学', '英语', 'python']
ddd = DataFrame(data=data,index=index, columns=columns)
ddd
输出:
语文 数学 英语 python
张三 8 144 106 21
李四 78.0 22 37 82
王五 17.0 8 29 75
赵六 84.0 12 134 19
首先定义一个字典
# 定义一个映射的字典
dic = {8: 80, 12: 120, 17: 71, 19:91}
调用.replace()
ddd.replace(dic)
输出:
语文 数学 英语 python
张三 80 144 106 21
李四 78 22 37 82
王五 71 80 29 75
赵六 84 120 134 91
replace还经常用来替换NaN元素
ddd
输出:
语文 数学 英语 python
张三 NaN 144 106 21
李四 78.0 22 37 82
王五 17.0 8 29 75
赵六 84.0 12 134 19
dic = {np.nan: 0}
ddd.replace(dic)
输出:
语文 数学 英语 python
张三 0.0 144 106 21
李四 78.0 22 37 82
王五 17.0 8 29 75
赵六 84.0 12 134 19
2) map()函数:新建一列
使用map()函数,由已有的列生成一个新列,适合处理某一单独的列。
ddd
输出:
语文 数学 英语 python
张三 NaN 144 106 21
李四 150.0 22 37 82
王五 17.0 29 300 16
赵六 84.0 12 134 19
仍然是新建一个字典
dic = {144: 144*2, 22:22*2, 8: 8*2, 12: 12*2}
ddd['理综'] = ddd['数学'].map(dic)
ddd
输出:
语文 数学 英语 python 理综
张三 NaN 144 106 21 288
李四 150.0 22 37 82 44
王五 17.0 29 300 16 58
赵六 84.0 12 134 19 24
map()函数中可以使用lambda函数
# 使用已有的值,修改已有的列 ,map不光可以新建一列,也可以修改已有列的数据
ddd['理综'] = ddd['数学'].map(lambda item: item*2)
ddd
输出:
语文 数学 英语 python 理综
张三 NaN 144 106 21 288
李四 150.0 22 37 82 44
王五 17.0 29 300 16 58
赵六 84.0 12 134 19 24
# 给map传一个函数
def convert(item):
if item > 200:
return '优秀'
elif item > 80:
return '及格'
else:
return '不及格'
ddd['理综成绩'] = ddd['python'].map(convert)
ddd
输出:
语文 数学 英语 python 理综 理综成绩
张三 NaN 144 106 21 288 不及格
李四 150.0 22 37 82 44 及格
王五 17.0 29 300 16 58 优秀
赵六 84.0 12 134 19 24 不及格
3) rename()函数:替换索引
ddd
输出:
语文 数学 英语 python score
张三 61 146 13 45 failed
李四 89 68 121 128 excellent
王五 89 13 42 2 failed
赵六 129 139 95 98 pass
仍然是新建一个字典
dic = {'语文': 'Chinese', '数学': 'Math', '英语': 'English'}
ddd.rename(columns=dic, axis=1)
输出:
Chinese Math English python score
张三 61 146 13 45 failed
李四 89 68 121 128 excellent
王五 89 13 42 2 failed
赵六 129 139 95 98 pass
使用rename()函数替换行索引
dic = {'张三': 'Zhangs Sir', '李四': 'Li Sir', '王五': 'LaoWang', '赵六': 'Mr Six'}
ddd.rename(index=dic)
输出:
语文 数学 英语 python score
Zhangs Sir 61 146 13 45 failed
Li Sir 89 68 121 128 excellent
LaoWang 89 13 42 2 failed
Mr Six 129 139 95 98 pass
3. 异常值检测和过滤
使用describe()函数查看每一列的描述性统计量
ddd
输出:
语文 数学 英语 python
张三 61 146 13 45
李四 89 68 121 128
王五 89 13 42 2
赵六 129 139 95 98
# 描述性的统计量
ddd.describe()
输出:
语文 数学 英语 python
count 4.00000 4.000000 4.000000 4.000000
mean 92.00000 91.500000 67.750000 68.250000
std 27.97618 63.089883 49.121448 55.930761
min 61.00000 13.000000 13.000000 2.000000
25% 82.00000 54.250000 34.750000 34.250000
50% 89.00000 103.500000 68.500000 71.500000
75% 99.00000 140.750000 101.500000 105.500000
max 129.00000 146.000000 121.000000 128.000000
使用std()函数可以求得DataFrame对象每一列的标准差
ddd.std()
输出:
语文 27.976180
数学 63.089883
英语 49.121448
python 55.930761
dtype: float64
根据每一列的标准差,对DataFrame元素进行过滤。
借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
对每一列应用筛选条件,去除标准差太大的数据
cond = (ddd > 3.5 * ddd.std(axis=0)).any(axis=1)
ddd[~cond]
输出:
语文 数学 英语 python
张三 61 146 13 45
李四 89 68 121 128
王五 89 13 42 2
4. 排序
使用.take()函数排序
可以借助np.random.permutation()函数随机排序
ddd
输出:
语文 数学 英语 python
张三 61 146 13 45
李四 89 68 121 128
王五 89 13 42 2
赵六 129 139 95 98
# take就是按照我们给定的index顺序来显示数据.
ddd.take([3,2,1,0])
输出:
语文 数学 英语 python
赵六 129 139 95 98
王五 89 13 42 2
李四 89 68 121 128
张三 61 146 13 45
ddd.take([3,2])
输出:
语文 数学 英语 python
赵六 129 139 95 98
王五 89 13 42 2
# 通过axis来控制拿的数据是行还是列.
ddd.take([3,2], axis=1)
输出:
python 英语
张三 45 13
李四 128 121
王五 2 42
赵六 98 95
np.random.permutation(4)
输出:
array([1, 0, 3, 2])
# 数据没有重复, 叫做无放回抽样.
ddd.take(np.random.permutation(4))
输出:
语文 数学 英语 python
赵六 129 139 95 98
李四 89 68 121 128
王五 89 13 42 2
张三 61 146 13 45
- 随机抽样
当DataFrame规模足够大时,直接使用np.random.randint()函数,就配合take()函数实现随机抽样
# np.random.randint 配合take()实现的是有放回抽样.
np.random.randint(0,4, size=4)
输出:
array([3, 2, 0,3])
ddd.take(np.random.randint(0,4, size=4))
输出:
语文 数学 英语 python
赵六 129 139 95 98
王五 89 13 42 2
张三 61 146 13 45
赵六 129 139 95 98
5. 数据聚合
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
- 分组:先把数据分为几组
- 用函数处理:为不同组的数据应用不同的函数以转换数据
- 合并:把不同组得到的结果合并起来
数据分类处理的核心: groupby()函数
df = DataFrame({'color':['red','white','red','cyan','cyan','green','white','cyan'],
'price':np.random.randint(0,8,size = 8),
'weight':np.random.randint(50,55,size = 8)})
df
输出:
color price weight
0 red 2 54
1 white 6 50
2 red 3 50
3 cyan 0 51
4 cyan 5 52
5 green 5 51
6 white 2 54
7 cyan 7 53
# 使用颜色对df进行分组
# 第一步,进行分组
df.groupby(by='color')
# 返回的对象,你就把它当成一个DataFrame
# 第二步使用聚合函数对分组之后的数据进行处理.
# 先计算,再从计算的结果中取数据.
df.groupby(by='color').sum()[['price']]
输出:
price
color
cyan 12
green 5
red 5
white 8
# 这种方式先取数据,再计算. 推荐先取数据,在计算,会性能高一些,更快一些.
price_sum = df.groupby(by='color')[['price']].sum()
price_sum
输出:
price
color
cyan 12
green 5
red 5
white 8
df.merge(price_sum, left_on='color', right_index=True, suffixes=['', '_sum'])
输出:
color price weight price_sum
0 red 2 5 5
2 red 3 50 5
1 white 6 50 8
6 white 2 54 8
3 cyan 0 51 12
4 cyan 5 52 12
7 cyan 7 53 12
5 green 5 51 5
网友评论