ser_obj = Series([1,NaN,None]) #notnull
pd.notnull(ser_obj)
0 True
1 False
2 False
dtype: bool
pd.isnull(ser_obj) #isnull
0 False
1 True
2 True
dtype: bool
pd.isna(ser_obj) #isna
0 False
1 True
2 True
dtype: bool
0或index:删除包含缺失值的行,默认为0
1或columns:删除包含缺失值的列
any:默认值,如果存在NaN值,则删除该行或者该列
all:如果所有值都是NaN值,则删除该行或者该列
df_obj = pd.DataFrame({'类别':['小说','随笔散文','青春文字','传记'],
'书名':[NaN,'《皮囊》','《旅行结束时》','《老舍自传》'],
'作者':['老舍',None,'张琪新','老舍']})
df_obj
类别 书名 作者
0 小说 NaN 老舍
1 随笔散文 《皮囊》 None
2 青春文字 《旅行结束时》 张琪新
3 传记 《老舍自传》 老舍
df_obj.dropna()
类别 书名 作者
2 青春文字 《旅行结束时》 张琪新
3 传记 《老舍自传》 老舍
ffill:将最后一个有效数据向后传播,也就是说用缺失值前面以得一个值代替缺失值
bfill:将最后一个有效值向前传播,也就是说用缺失值后面的一个值代替缺失值
limit:可以连续填充的最大数量,默认为None
df_obj = pd.DataFrame({'A':[1.0,2.0,3.0,NaN],'B':[NaN,2.0,NaN,6.0],'C':['a',7,8,9],'D':[NaN,2.0,3.0,NaN]})
df_obj #查看原数据
A B C D
0 1.0 NaN a NaN
1 2.0 2.0 7 2.0
2 3.0 NaN 8 3.0
3 NaN 6.0 9 NaN
df_obj.fillna(66) #使用66进行填充
A B C D
0 1.0 66.0 a 66.0
1 2.0 2.0 7 2.0
2 3.0 66.0 8 3.0
3 66.0 6.0 9 66.0
df_obj.fillna({'A':5.0,'B':8.0,'C':99}) #传入字典根据索引进行填充
A B C D
0 1.0 8.0 a NaN
1 2.0 2.0 7 2.0
2 3.0 8.0 8 3.0
3 5.0 6.0 9 NaN
df_obj.fillna(method='bfill') #使用缺失值后边一个的数据进行填充
A B C D
0 1.0 2.0 a 2.0
1 2.0 2.0 7 2.0
2 3.0 6.0 8 3.0
3 NaN 6.0 9 NaN
duplicated(subset=None,keep=‘first’)
df_obj = pd.DataFrame({'id':[1,2,3,4,4,5],
'name':['小鸣','小月月','彭艳','硫化','硫化','周华'],
'age':[18,18,29,58,58,36],
'height':[180,180,185,175,175,178],
'gender':['女','女','男','男','男','男']})
df_obj
id name age height gender
0 1 小鸣 18 180 女
1 2 小月月 18 180 女
2 3 彭艳 29 185 男
3 4 硫化 58 175 男
4 4 硫化 58 175 男
5 5 周华 36 178 男
df_obj.duplicated() #从前向后查找重复值
0 False
1 False
2 False
3 False
4 True
5 False
dtype: bool
df_obj.drop_duplicates()
id name age height gender
0 1 小鸣 18 180 女
1 2 小月月 18 180 女
2 3 彭艳 29 185 男
3 4 硫化 58 175 男
5 5 周华 36 178 男
我的理解就是数据要在(u-3a,u+3a)之间 u是平均值 a是标准差
arr = pd.DataFrame({'A':[1,1,2,3,4,5,6,4,8,5,1,4,52,],'B':[1,2,2,6,8,321,5,4,8,1,3,5,1]})
arr
A B
0 1 1
1 1 2
2 2 2
3 3 6
4 4 8
5 5 321
6 6 5
7 4 4
8 8 8
9 5 1
10 1 3
11 4 5
12 52 1
import numpy as np
def three_sigma(arr):
#求平均值
mean_value = arr.mean()
#求标准差
std_value = arr.std()
#位于(u-3a,u+3a)的值为正常值,不在这个区间的就是异常值,一旦发现异常值就标记为True,否则标记为False
rule = ((mean_value-3 * std_value>arr)) | ((mean_value+3*std_value
df = pd.DataFrame({'A':[1,2,3,4],
'B':[2,2,3,2],
'C':[1,4,7,4],
'D':[1,2,30,4]})
df.boxplot(column=['A','B','C','D'])
接上边代码中的df
df.replace(to_replace=30,value=2)
A B C D
0 1 2 1 1
1 2 2 4 2
2 3 3 7 2
3 4 2 4 4
astype(dtype,compy=True,errors= ‘raise’,**kwargs)(除数字以外的数据会报错)
df = pd.DataFrame({'A':['1','2','3','4'],
'B':['-1','-2','33','24']})
df = df.astype(dtype='int')
df
A B
0 1 -1
1 2 -2
2 3 33
3 4 24
df.dtypes
A int32
B int32
dtype: object
astype和to_numeric的区别(我自己理解的不喜勿喷):astype转换类型时需要看原数据的类型,如果原数据是’5.5’这种的数据,在转int类型时会报错
ser_obj = pd.Series(['1.5','5'])
ser_obj
0 1.5
1 5
dtype: object
pd.to_numeric(arg=ser_obj,downcast='integer')
0 1.5
1 5.0
dtype: float64
内连接所得结果是他们的交集,外连接是他们的并集
df1 = pd.DataFrame({'A':['A0','A0','A1'],
'B':['B0','B0','B1']})
df2 = pd.DataFrame({'C':['C0','C0','C1','C3'],
'D':['D0','D2','D2','D3']})
pd.concat([df1,df2],join='outer',axis=1)
A B C D
0 A0 B0 C0 D0
1 A0 B0 C0 D2
2 A1 B1 C1 D2
3 NaN NaN C3 D3
df1 = pd.DataFrame({'A':['A0','A0','A1'],
'B':['B0','B0','B1']})
df2 = pd.DataFrame({'B':['C0','C0','C1','C3'],
'D':['D0','D2','D2','D3']})
pd.concat([df1,df2],axis=0,join='inner')
B
0 B0
1 B0
2 B1
0 C0
1 C0
2 C1
3 C3
- left:使用左侧的DataFrame的键,类似于SQL的左外连接
- right:使用右侧的DataFrame的键,类似于SQL的右外连接
- outer:使用两个DataFrame所有键,类似于SQL的全连接
- inner:使用两个DataFrame键的交集,类似于SQL的内连接
在使用merge()函数时,默认会使用重叠的列作为合并键,并采用内连接方式合并数据,既取行索引重叠的部分
left = pd.DataFrame({'key':['K0','K1','K2'],
'A':['A0','A1','A2'],
'B':['B0','B1','B2']})
right = pd.DataFrame({'key':['K0','K1','K2','K3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
left
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
right
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3
pd.merge(left,right,on='key') #通过key来连接
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
left = pd.DataFrame({'key':['K0','K1','K2'],
'A':['A0','A1','A2'],
'B':['B0','B1','B2']})
right = pd.DataFrame({'key':['K0','K1','K2','K3'],
'B':['B0','B1','B2','B3'],
'D':['D0','D1','D2','D3']})
left
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
right
key B D
0 K0 B0 D0
1 K1 B1 D1
2 K2 B2 D2
3 K3 B3 D3
pd.merge(left,right,on=['key','B'])
key A B D
0 K0 A0 B0 D0
1 K1 A1 B1 D1
2 K2 A2 B2 D2
内外向连接和轴向堆叠的内外连接时一样的,这里就不演示代码部分了
左连接就是分别按照左边表为基准连接,右连接相反,这里也不演示代码了
即使左右两个表没有重叠的部分也可以强行拼接,只需要将left_index和right_index设置为True即可
left = pd.DataFrame({'A':['A0','A1','A2'],
'B':['B0','B1','B2']})
right = pd.DataFrame({'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
pd.merge(left,right,left_index=True,right_index=True)
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
left = pd.DataFrame({'A':['A0','A1'],
'B':['B0','B1']},index=['a','b'])
right = pd.DataFrame({'C':['C0','C1'],
'D':['D0','D1']},index=['c','d'])
left.join(right,how='outer')
A B C D
a A0 B0 NaN NaN
b A1 B1 NaN NaN
c NaN NaN C0 D0
d NaN NaN C1 D1
left = pd.DataFrame({'A':['A0','A1','A2'],
'B':['B0','B1','B2'],'key':['k0','k1','k2']})
right = pd.DataFrame({'C':['C0','C1','C2'],
'D':['D0','D1','D2']},index=['k0','k1','k2'])
left.join(right,on='key')
A B key C D
0 A0 B0 k0 C0 D0
1 A1 B1 k1 C1 D1
2 A2 B2 k2 C2 D2
当一个DataFrame对象出现了缺失数据,而对于这些缺失数据,我们以往可以使用其他的DataFrame对象进行填充,可以使用combine_first()方法进行填充
需要强调的是,想要用right来填充left数据时,他们必须拥有重叠部分
- level:表示操作内层索引,若设为0,表示操作外层索引,默认为-1
- dropna:表示是否将旋转后的缺失值删除,若设为True。则表示自动过滤缺失值,设置为Flase则相反
df = pd.DataFrame({'A':['A0','A1','A2'],
'B':['B0','B1','B2']})
df
A B
0 A0 B0
1 A1 B1
2 A2 B2
result = df.stack()
result
0 A A0
B B0
1 A A1
B B1
2 A A2
B B2
dtype: object
- level:表示操作内层索引,若设置为0则操作外层索引,默认为-1
- fill_value:若产生了缺失值,则可以设置这个参数用来代替NaN
result1 = result.unstack()
result1
A B
0 A0 B0
1 A1 B1
2 A2 B2
- index:用于创建新DataFrame对象的行索引,如果未设置,则使用原DataFrame对象的索引
- colums:用于创建新DataFrame对象的列索引,如果未设置,则使用原DataFrame对象的索引
- values:用于创建新DataFrame对象中的值
df = pd.DataFrame({'商品名称':['荣耀9青春版','小米6x','oppo al','荣耀9青春版','小米6x','oppo al'],
'出售日期':['2017.05.25','2017.05.25','2017.05.25','2017.06.18','2017.06.18','2017.06.18'],
'价格':['999元','1399元','1399元','800元','1200元','1250元']})
df
商品名称 出售日期 价格
0 荣耀9青春版 2017.05.25 999元
1 小米6x 2017.05.25 1399元
2 oppo al 2017.05.25 1399元
3 荣耀9青春版 2017.06.18 800元
4 小米6x 2017.06.18 1200元
5 oppo al 2017.06.18 1250元
df.pivot(index='出售日期',columns='商品名称',values='价格') #通过pivot进行轴向旋转
商品名称 oppo al 小米6x 荣耀9青春版
出售日期
2017.05.25 1399元 1399元 999元
2017.06.18 1250元 1200元 800元
- rename(napper=None,index=None,columns=None,axis=None,copy=True,inplace=False,level=None)
- index,columns:表示待转换的行索引和列索引
- axis:表示轴名称,可以使用index或columns,也可以使用0或1
- copy:表示是否复制底层的数据,默认为Flase
- inplace:默认为False,表示返回新的Pandas对象,如果设置为True,则会忽略复制的值
- level:表示级别名称,默认为None,对于多级索引,只重命名指定的标签
df = pd.DataFrame({'A':['A0','A1','A2','A3'], #原数据
'B':['B0','B1','B2','B3'],
'C':['C0','C1','C2','C3']})
df
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
df.rename(columns={'A':'a','B':'b','C':'c'}) #使用rename修改列索引
a b c
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
df.rename(str.lower,axis='columns') #使用str内置函数直接变小写
a b c
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
df.rename(index={0:'a',1:'b'}) #使用rename修改行索引
A B C
a A0 B0 C0
b A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
- x:表示要分箱的数组,必须是一维的
- bins:接收int和序列类型的数据,如果传入的是int类型的值,则表示在x范围内的等宽单元的数量(划分为多少个等间距区);如果传入的是一个序列,则表示将x划分在指定的序列中,若不在此序列中,则为NaN
- right:是否包含右端点,决定区间的开闭,默认为True
- labels: 用于生成区间的标签
- retbins:是否返回bin
- precision:精度,默认保存三位小数
- include_lowest:是否包含左端点
ages = [20,22,25,27,21,23,37,31,61,45,32]
bins = [0,18,25,35,60,100]
cuts = pd.cut(ages,bins)
cuts
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (35, 60], (25, 35], (60, 100], (35, 60], (25, 35]]
Length: 11
Categories (5, interval[int64]): [(0, 18] < (18, 25] < (25, 35] < (35, 60] < (60, 100]]
#如果希望左闭右开区间,则可以在调用cut()函数时传入right=Flase进行修改
pd.cut(ages,bins,right=True)
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (35, 60], (25, 35], (60, 100], (35, 60], (25, 35]]
Length: 11
Categories (5, interval[int64]): [(0, 18] < (18, 25] < (25, 35] < (35, 60] < (60, 100]]
df1 = pd.DataFrame({'职业':['学生','司机','老师','导游']})
df1
职业
0 学生
1 司机
2 老师
3 导游
_
pd.get_dummies(df1,prefix=['col_'])
col__司机 col__学生 col__导游 col__老师
0 0 1 0 0
1 1 0 0 0
2 0 0 0 1
3 0 0 1 0