环境:python3.7
pip install numpy -i https://pypi.douban.com/simple
pip install pandas -i https://pypi.douban.com/simple
一、删除重复的行
1.1
查询重复的行:duplicated()
删除重复的行:drop_duplicates()
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 数据框生成函数
def make_df(index,columns):
data = {k:[k+str(i) for i in index] for k in columns}
return DataFrame(data=data,index=index)
df = make_df([1,2,3,4],list('ABCD'))
# 查找重复的数据,如果不是第一次出现的数据则为True
print(df.duplicated())
print()
# 参数keep():设置是从前面往后面查或从后面往前面查,默认是从前往后查
print(df.duplicated(keep='last'))
print()
# 将第二行的数据给到第一行
df.iloc[0] = df.iloc[1]
# 修改数据,将第一行的最后一个修改成'D1'
df.iloc[0, 3] = 'D1'
# 参数subset():设置一列中要查找的数据
print(df.duplicated(subset=['A','B']))
print()
# 删除第二行
eg = df.duplicated(subset=['A','B'])
print(df.loc[~eg])
print()
# 对duplicated返回的bool取反
print(np.logical_not(eg))
print()
#删除重复的数据
print(df.drop_duplicates(subset=['A', 'B', 'C']))
1 False
2 False
3 False
4 False
dtype: bool
1 False
2 False
3 False
4 False
dtype: bool
1 False
2 True
3 False
4 False
dtype: bool
A B C D
1 A2 B2 C2 D1
3 A3 B3 C3 D3
4 A4 B4 C4 D4
1 True
2 False
3 True
4 True
dtype: bool
A B C D
1 A2 B2 C2 D1
3 A3 B3 C3 D3
4 A4 B4 C4 D4
Process finished with exit code 0
二、映射
2.1 替换元素
2.1.1
替换元素:replace()
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 创建数据框
index = ['张三','李四','王五','赵六']
data = {'语文':[45,56,44,4],'数学':[45,56,31,66],'英语':[45,56,21,11]}
df = DataFrame(data=data,index=index)
print(df)
print()
# 匹配整个数据框替换,不改变原数据框
new_df = df.replace({4:100, 31:99, 21:98, 58:97})
print(new_df)
print()
# 匹配某一行替换
new_df1 = df.iloc[2].replace({44:97})
print(new_df1)
print()
# 替换元素
df.iloc[0,2] = 100
print(df)
语文 数学 英语
张三 45 45 45
李四 56 56 56
王五 44 31 21
赵六 4 66 11
语文 数学 英语
张三 45 45 45
李四 56 56 56
王五 44 99 98
赵六 100 66 11
语文 97
数学 31
英语 21
Name: 王五, dtype: int64
语文 数学 英语
张三 45 45 100
李四 56 56 56
王五 44 31 21
赵六 4 66 11
Process finished with exit code 0
2.2 新增行列
新增:map()
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 数据框生成函数
def make_df(index,columns):
data = {k:[k+str(i) for i in index] for k in columns}
return DataFrame(data=data,index=index)
df = make_df([1,2,3,4],list('ABCD'))
print(df)
print()
# 新增一列
df['E'] = df['D'].map({'D1':'E1','D2':'E2','D3':'E3','D4':'E4'})
print(df)
print()
# 新增一行,无法使用iloc来新增一行,索引不能扩大
df.loc[5] = df.loc[4].map({'A4':'A5','B4':'B5','C4':'C5','D4':'D5','E4':'E5'})
print(df)
A B C D
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
A B C D E
1 A1 B1 C1 D1 E1
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
4 A4 B4 C4 D4 E4
A B C D E
1 A1 B1 C1 D1 E1
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
4 A4 B4 C4 D4 E4
5 A5 B5 C5 D5 E5
Process finished with exit code 0
2.3 替换索引
替换索引:rename()
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 数据框生成函数
def make_df(index,columns):
data = {k:[k+str(i) for i in index] for k in columns}
return DataFrame(data=data,index=index)
df = make_df([1,2,3,4],list('ABCD'))
print(df)
print()
# 替换列索引,不改变原来的数据库索引
new_df = df.rename(columns={'A':'a','B':'b','C':'c','D':'d'})
print(new_df)
print()
# 替换行索引,不改变原来的数据库索引
new_df1 = df.rename(index={1:'张三',2:'李四',3:'王五',4:'赵六'})
print(new_df1)
print()
# 用轴axis替换索引
new_df2 = df.rename({1:'语文',2:'英语',3:'数学',4:'理综'},axis=0)
print(new_df2)
print()
new_df3 = df.rename({'A':'张三','B':'李四','C':'王五','D':'赵六'},axis=1)
print(new_df3)
A B C D
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
a b c d
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
A B C D
张三 A1 B1 C1 D1
李四 A2 B2 C2 D2
王五 A3 B3 C3 D3
赵六 A4 B4 C4 D4
A B C D
语文 A1 B1 C1 D1
英语 A2 B2 C2 D2
数学 A3 B3 C3 D3
理综 A4 B4 C4 D4
张三 李四 王五 赵六
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
Process finished with exit code 0
三、异常值检测
3.1
查看每一列统计量描述状态:describe()
求每一列的标准差:std()
pycharm看不到详细描述,得使用Anaconda_Windows-2020
这个软件才能看得到
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 数据框生成函数
def make_df(index,columns):
data = {k:[k+str(i) for i in index] for k in columns}
return DataFrame(data=data,index=index)
df = make_df([1,2,3,4],list('ABCD'))
print(df)
print()
# 查看每一列的统计量描述
print(df.describe())
print()
# 查看每一列的标准差
print(df.std())
A B C D
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
A B C D
count 4 4 4 4
unique 4 4 4 4
top A2 B3 C3 D3
freq 1 1 1 1
Series([], dtype: float64)
Process finished with exit code 0
四、分组聚合
分组函数:groupby()
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
data = {'学科':['语文','数学','数学','化学','化学','生物','语文'],'期中分数':[67,78,89,90,81,82,83],'期末分数':[56,57,58,59,71,72,73],'理综':[46,44,48,49,61,62,63]}
index = ['张三','李四','王五','赵六','小明','小红','小李']
df = DataFrame(data=data,index=index)
print(df)
print()
# 分组聚合
print(df.groupby(by='学科').sum())
print()
# 加后缀
print(df.add_suffix('-SUM'))
print()
# 加前缀
print(df.add_prefix('-SUM'))
print()
# transform():分组聚合,实现和分组聚合一样
new_df = df.groupby(by='学科')[['期中分数']].transform(sum)
print(new_df)
print()
# apply():分组聚合,实现和分组聚合一样,区别在于结果索引变成分组,容易观察
new_df1 = df.groupby(by='学科')[['期中分数']].apply(sum)
print(new_df1)
学科 期中分数 期末分数 理综
张三 语文 67 56 46
李四 数学 78 57 44
王五 数学 89 58 48
赵六 化学 90 59 49
小明 化学 81 71 61
小红 生物 82 72 62
小李 语文 83 73 63
期中分数 期末分数 理综
学科
化学 171 130 110
数学 167 115 92
生物 82 72 62
语文 150 129 109
学科-SUM 期中分数-SUM 期末分数-SUM 理综-SUM
张三 语文 67 56 46
李四 数学 78 57 44
王五 数学 89 58 48
赵六 化学 90 59 49
小明 化学 81 71 61
小红 生物 82 72 62
小李 语文 83 73 63
-SUM学科 -SUM期中分数 -SUM期末分数 -SUM理综
张三 语文 67 56 46
李四 数学 78 57 44
王五 数学 89 58 48
赵六 化学 90 59 49
小明 化学 81 71 61
小红 生物 82 72 62
小李 语文 83 73 63
期中分数
张三 150
李四 167
王五 167
赵六 171
小明 171
小红 82
小李 150
期中分数
学科
化学 171
数学 167
生物 82
语文 150
Process finished with exit code 0