醒醒,别睡了...讲《数据分析pandas库》了—/—<7>

一、

1、处理缺失值

1.1 认识缺失值
        系统默认的缺失值 None np. nan
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 缺失值查看
        直接调用info() 方法就会返回每一列的缺失情况。
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
df.info()
         
        Pandas中缺失值用NaN 表示,从用 info() 方法的结果来看,索引 1 这一列是1 2 non-null float64 ,表示这一列有 2 个非空值,而应该是 3个非空值,说明这一列有 1 个空值。还可以用isnull() 方法来判断哪个值是缺失值,如果是缺失值则返回True,如果不是缺失值返回 False

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 以进—步指明哪些索引/列会被替换 不能使用 list
    method = 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、all
    any :任何一个为 NA 就删除
    all :所有的都是 NA 删除
    thresh = None :删除的数量阈值,
    int
    subset :希望在处理中包括的行/列子集
    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_timeend_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中的YearMonthDayHour列的值转换为datetime类型的数据。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值