一、
1、处理缺失值
1.1 认识缺失值
data=pd.Series([3,4,np.nan,1,5,None])
df=pd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]])
1.2 缺失值查看
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
df.info()
1.3 获取所有缺失值
df.isna(): 检查相应的数据是否为缺失值 同 df.isnull()
df.notna()等同于notnull()
data=pd.Series([3,4,np.nan,1,5,None])
print('isnull()方法判断是否是缺值:')
print(data.isnull())
print(data.isna())
print('获取缺值:')
print(data[data.isnull()])
print('获取非空值')
print(data[data.notnull()])
1.4 检查多个单元格的取值是否为指定缺值
1.4.1 any()
df.any(axis : index (0), columns (1)skipna = True :检查时是否忽略缺失值level = None :多重索引时指定具体的级别
)
1.4.2 all()
df.all(axis : index (0), columns (1)skipna = True :检查时是否忽略缺失值level = None :多重索引时指定具体的级别
)
实例如下:
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
df.info()
#默认检测的是列值
df.isna().any()
#检测行值
df.isna().any(1)
df[df.isna().any(1)]
1.5 填充缺失值
调用fillna()方法对数据表中的所有缺失值进行填充,在fillna()方法 中输入要填充的值。还可以通过method参数使用前一个数和后一个数来进行填充。
其用法如下:
df.fillna(value :用于填充缺失值的数值,也可以提供dict/Series/DataFrame 以进—步指明哪些索引/列会被替换 不能使用 listmethod = None :有索引时具体的填充方法,向前填充,向后填充等limit = None :指定了 method 后设定具体的最大填充步长,此步长不能填充axis : index (0), columns (1)inplace = False
)
1.5.1 :Series对象缺失值填充(ffill、bfill)
data=pd.Series([3,4,np.nan,1,5,None])
print('以0进行填充:')
print(data.fillna(0))
print('以前一个数进行填充:')
print(data.fillna(method='ffill'))
print('以后一个数进行填充:')
print(data.fillna(method='bfill'))
print('先按前一个,再按后一个')
print(data.fillna(method='bfill').fillna(method='ffill'))
1.5.2 :DataFrame对象缺失值填充(ffill、bfill)
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('使用数值0来填充:')
print(df.fillna(0))
print('使用行的前一个数来填充:')
print(df.fillna(method='ffill'))
print('使用列的后一个数来填充:')
print(df.fillna(method='bfill' ,axis=1))
1.5.3 :列的平均值来填充
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
for i in df.columns:df[i]=df[i].fillna(np.nanmean(df[i]))
print(df)
1.6 删除缺失值
调用dropna()方法删除缺失值,dropna()方法默认删除含有缺失值 的行,也就是只要某一行有缺失值就把这一行删除。如果想按列为单位删除缺失值,需要传入参数axis=’columns’。
df.dropna(axis = 0 : index (0), columns (1)how = any : any、allany :任何一个为 NA 就删除all :所有的都是 NA 删除thresh = None :删除的数量阈值,intsubset :希望在处理中包括的行/列子集inplace = False :
)
1.6.1 删除缺失值
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('默认为以行为单位剔除:')
print(df.dropna())#剔除整行
print('以列为单位剔除:')
df.dropna(axis='columns')#剔除整列
1.6.2 删除空白行
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('所有为nan时候才剔除:')
print(df.dropna(how='all'))
print('默认情况,只要有就剔除')
print(df.dropna(how='any'))
1.7 数据查重
1.7.1 标识出重复的行Duplicated
标识出重复行的意义在于进一步检査重复原因,以便将可能的错误数据加以修改
df['dup' ] = df.duplicated( ['课程','开设'])
1.7.2 利用索引进行重复行标识
df.index.duplicated()
df2 = df.set_index ( ['课程','开设'] )#将DataFrame的索引设置为多个列,即['课程', '开设']。通过设置index参数为这两个列名称,可以将这两列作为DataFrame的新索引
df2.index.duplicated ()#检查新索引中是否存在重复的行。返回的是一个布尔型的Series,其中True表示索引是重复的,False表示索引是唯一的。
1.7.3 直接删除重复的行
drop_duplicates (subset=""按照指定的行逬行去重keep='first' 、 'last' 、 False 是否直接删除有重复的所有记录
)
df. drop_duplicates ( ['课程', '开设' ] )
df. drop_duplicates ( ['课程', '开设' ] , keep= False )
1.7.4 利用査重标识结果直接删除
df[~df.duplicated( )]
df[~df . duplicated ( ['课程', '开设' ] )]
2、日期时间变量
2.1 Timestamp
在pandas中,Timestamp是一个用于表示时间戳的数据类型。它是pandas提供的一种高效、灵活的时间数据类型。
Timestamp可以用于存储和操作精确到纳秒级别的时间数据。它可以表示特定的日期和时间,包括年、月、日、小时、分钟、秒等信息。并且可以进行各种时间相关的操作,如日期和时间的比较、排序、索引、切片、聚合等。它还支持将时间戳对象与其他时间数据类型进行转换,并提供了许多方便的时间函数和属性,如获取年份、月份、星期几、季度等。
from datetime import datetime
pd.Timestamp(datetime(2032,1,1))
pd.Timestamp(datetime(2032,1,2,3,4,5))
pd.Timestamp(2032,1,2)
pd.Timestamp('2032-01-02 3:4:5')
- 第二行代码创建了一个时间戳对象,表示2032年1月1日。
- 第三行代码创建了另一个时间戳对象,表示2032年1月2日3点4分5秒。
- 第四行代码创建了一个时间戳对象,表示2032年1月2日。
- 第五行代码通过字符串传递给Timestamp函数,创建了一个时间戳对象,表示2032年1月2日3点4分5秒。
2.2 Peroid
Peroid是一个用于表示时间段(时间区间)
Peroid表示一个连续的时间段,例如一个月、一个季度、一年等。它具有固定的开始和结束时间,并且可以通过指定频率来表示不同的时间间隔,如天、周、月、季度、年等。
Peroid对象有两个主要属性,即start_time和end_time,用于表示时间段的起始时间和结束时间。它还提供了一些方便的方法来处理时间段,如获取时间段的长度、比较不同时间段的顺序关系等。
Peroid可以与其他时间对象(如Timestamp、DatetimeIndex等)进行操作和转换,并广泛应用于时间序列数据的处理、分析和可视化中。
pd.Period('2032-01')
pd.Period('2032-01',freq='D')#精确到日
2.3 数据转换
2.3.1 使用 pd.Timestamp()直接转换
pd.Timestamp(df['date'][0])
df['date'].apply(pd.Timestamp)
pd.Timestamp(df['date'][0])
的代码将DataFrame中date
列的第一个元素转换为Timestamp
类型的数据。
df['date'].apply(pd.Timestamp)
的代码将DataFrame中date
列中的所有元素逐个应用
2.3.2 用 to_datetime 进同比量转换
pd.to_datetime(arg :需要转换为 Timestamp 类的数值Integer, float, string, datetime, list, tuple, 1-d array,Series,errors = ‘raise' : (‘ ignore' , ‘raise' , 'coerce' )'raise ' 抛出错误'coerce' 设定为 NaT'ignore' 返回原值短日期的解释方式:类似 '10/11/12"这样的数据如何解释dayfirst = ‘False' : 数值是否 day 在前yearfirst = 'False':数值是否 year 在前,该设定优先box = True :是否返回为 DatetimeIndex, False 时返回ndarray 数组format = None :需要转换的字符串格式设定)
pd.to_datetime(datetime(2032, 1, 2, 3, 4, 5))
pd.to_datetime('2032-01-02 3:4:5')
pd.to_datetime(['2032/01/02' , '2032.01.03'])
pd.to_datetime(df[ 'date' ], format = '%Y-%m-%d %H:%M')
pd.to_datetime(datetime(2032, 1, 2, 3, 4, 5))
的代码将传入的datetime
对象转换为Timestamp
类型的数据。
pd.to_datetime('2032-01-02 3:4:5')
的代码将传入的字符串日期时间转换为Timestamp
类型的数据。
pd.to_datetime(['2032/01/02', '2032.01.03'])
的代码将传入的日期字符串列表转换为DatetimeIndex
类型的数据。
pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M')
的代码将DataFrame中的date
列中的日期时间字符串按照指定的格式进行解析,并将其转换为DatetimeIndex
类型的数据。
2.3.4 基于所需的变量列合成 Timestamp 类
pd.to_datetime(df[['Year' , 'Month' , 'Day' ,'Hour']])
即将DataFrame中的Year
、Month
、Day
和Hour
列的值转换为datetime
类型的数据。