Pandas的学习和使用三
一、了解缺失值
在Pandas中,缺失值(Missing Values)指的是数据中的空缺或未定义的值;
在Pandas中,主要使用以下两种表示缺失值的方式:
1、None : Python中的特殊对象
2、NaN(Not a Number):NaN是一个特殊的浮点数值,用于表示数值型数据中的缺失值
注意:
NaN和None是不同的对象。一般来说:
在处理数值型数据时使用NaN
在处理对象型或字符串型数据时使用None
提示
在数据分析和处理过程中,经常需要处理缺失值
查看缺失值的方法:
isnull():该方法返回一个布尔值的DataFrame/Series,其中缺失值位置为True,非缺失值位置为False;
notnull():该方法与isnull()相反,返回一个布尔值的DataFrame/Series,其中非缺失值位置为True,缺失值位置为False;
isna()和notna():这两个方法与isnull()和notnull()的功能相同,可以互换使用;
any()和all():这两个方法可以结合使用,用于检查DataFrame/Series中是否存在缺失值。
any()方法返回一个布尔值,如果至少有一个缺失值,则为True;
all()方法返回一个布尔值,只有当所有值都是缺失值时才为True;
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, None], 'B': [3, np.nan, 5]})
print(df.isnull())# 检查缺失值
print(df.notnull())
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, None], 'B': [3, np.nan, 5]})
print(df.isnull().any())#检查某行,或者某列是否有缺失值,默认按列,axis=0
print(df.isnull().all())#检查全部
二、填充缺失值
在Pandas中,填充缺失值是数据处理过程中常见的操作之一。
当数据中存在缺失值时,可以使用不同的方法来填充这些缺失值,以便继续进行数据分析和处理;
fillna()方法
fillna()方法用于填充缺失值。可以通过指定一个常数值、使用前一个或后一个非缺失值进行填充,或者使用插值方法进行填充。
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
1、value :要使用的填充值,可以是一个具体的数值、字典、Series、DataFrame或者方法(如mean、median)
2、method :指定填充方法,可选参数包括
backfill 后向填充
bfill 后向填充
pad 前向填充
ffill 前向填充
axis : 指定填充的轴方向,可以是0(按列填充)或1(按行填充)
3、inplace:是否原地修改数据
默认为False,即返回一个新的填充后的对象,
若为True,则在原数据上进行修改
4、limit : 指定连续缺失值填充的最大数量
#常数填充:使用指定的常数值填充缺失值
import pandas as pd
df = pd.DataFrame({'A': [1, 2, None, 4]})
df_filled = df.fillna(0) # 使用0填充缺失值
print(df_filled)
#使用前一个或后一个非缺失值填充:使用前一个或后一个非缺失值来填充缺失值。
import pandas as pd
df = pd.DataFrame({'A': [1, 2, None, 4]})
df_filled = df.fillna(method='ffill') # 使用前一个非缺失值填充
print(df_filled)
#插值填充:使用插值方法根据已知数据进行估计填充缺失值
import pandas as pd
df = pd.DataFrame({'A': [1, 2, None, 4]})
df_filled = df.interpolate() # 使用插值方法填充缺失值
print(df_filled)
#使用统计量填充:可以使用数据的统计量,如均值、中位数或众数来填充缺失值。可以通过mean()、median()、mode()等方法计算统计量,并使用fillna()方法进行填充
import pandas as pd
df = pd.DataFrame({'A': [1, 2, None, 4]})
mean_value = df['A'].mean() # 计算均值
df_filled = df.fillna(mean_value) # 使用均值填充缺失值
print(df_filled)
三、删除缺失值
在Pandas中,删除缺失值是数据处理中常见的操作之一,可以使用dropna()方法来删除包含缺失值的行或列。
dropna()方法
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
1、axis:指定删除缺失值的轴方向,可以是0(按列删除)或1(按行删除)
2、how:指定删除行或列的条件,可选参数包括any和all
3、any表示只要存在一个缺失值就删除对应的行或列
4、all表示只有全部是缺失值时才删除。
5、thresh:指定非缺失值的最小数量,小于该数量的行或列将被删除。
6、subset:指定要考虑的列或行的标签,用于确定删除缺失值的范围。
7、inplace:是否原地修改数据,默认为False,即返回一个新的删除缺失值后的对象,若为True,则在原数据上进行修改。
df3 = pd.DataFrame({'A':[1,2,None,4],'B':[None,6,None,None]})
# 删除非缺失值,任意行有缺失值少于2个就删除
# df3.dropna(thresh=2)
# 指定某列数据删除缺失值
# df3.dropna(subset=['A'])
# 删除缺失值,任意行有缺失值就删除
# 默认axis=0,即删除行,只要有一个缺失值就删除any
# df3.dropna()
# 删除缺失值,列的缺失值
df3.dropna(axis=1)
四、删除重复数据
在Pandas中,可以使用一些方法来查找和处理重复的数据。重复数据通常指的是DataFrame中的行或列具有相同的数值。
duplicated方法
在Pandas中用于查找重复行的方法。它返回一个布尔型的Series,表示每一行是否是重复的;
df.duplicated(subset=None, keep=‘first’)
subset :可选参数,用于指定需要考虑的列默认为None,表示考虑所有列。可以传入列名或列名的列表,只有指定的列的数值相同时才认为是重复。
keep :可选参数,用于指定保留哪个重复行默认为’first’,表示保留第一个出现的重复行。也可以设置为’last’,表示保留最后一个出现的重复行。如果设置为False,则表示将所有重复行都标记为True。
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 2], 'B':
['a', 'b', 'c', 'a']})
duplicates = df.duplicated() # 查找重复的行
print(duplicates)
利用査重标识结果直接删除
df[~df.duplicated( )]
df[~df.duplicated(['A', 'B'])]
drop_duplicates
在Pandas中用于删除重复行的方法。它会返回一个新的DataFrame
对象,其中不包含重复的行。
df.drop_duplicates(subset=None, keep=‘first’, inplace=False)
1、subset :可选参数,用于指定需要考虑的列,默认为None,表示考虑所有列。可以传入列名或列名的列表,只有指定的列的数值相同时才被认为是重复行。
2、keep :可选参数,用于指定保留哪个重复行,默认为’first’,表示保留第一个出现的重复行。也可以设置为’last’,表示保留最后一个出现的重复行。如果设置为False,则表示删除所有重复行。
3、inplace :可选参数,表示是否在原DataFrame对象上进行修改,默认为False,即返回一个新的DataFrame对象。
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3, 2], 'B':
['a', 'b', 'c', 'a']})
df_dropped = df.drop_duplicates() # 删除重复的
行
print(df_dropped)
五 、日期时间类型
在Pandas中,时间变量是指用于表示日期和时间的数据类型和功
能。Pandas提供了多个功能强大的时间相关的数据结构和方法,方便对
时间数据进行处理和分析。
Timestamp
表示一个具体的时间点,精确到纳秒级别。可以通过 pd.Timestamp() 函数创建Timestamp对象,或者通过将时间字符串转换为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')
Peroid
可以被看作是简化之后的 Timestamp 对象
由于详细数据的不完整,而表示的是一段时间,而不是一个时点但是实际使用中很可能是按照时点在使用。
import pandas as pd
pd.Period('2032-01')
pd.Period('2032-01',freq='D')#精确到日
period = pd.Period('2032-06', freq='M')
print(period.start_time) # 获取起始时间
print(period.end_time) # 获取结束时间
new_period = period.asfreq('D') # 将时间段转换为天频率
print(new_period)
六、时间类型的转换
在Pandas中,可以使用多种方法进行时间类型的转换。
to_datetime方法
pd.to_datetime(arg, format=None,errors=‘raise’, utc=None)
1、arg :要转换为时间类型的数据,可以是字符串、整数、浮点
数、Series、列表等。
2、format :可选参数,用于指定解析字符串的格式,需要与字符串
的格式相匹配。
3、errors :可选参数,用于指定在转换过程中遇到错误时的处理方
式。
默认为’raise’,表示遇到错误时抛出异常;
可以设置为’ignore’,表示忽略错误并返回原始输入。
4、utc :可选参数,用于指定是否将转换后的时间类型设置为UTC
时间。
默认为None,表示保持与输入数据的时区一致;
可以设置为True,表示将时间类型转换为UTC时间;
可以设置为False,表示不进行时区调整。
import pandas as pd
# 转换字符串为时间类型
date_string = '2030-06-30'
timestamp = pd.to_datetime(date_string)
print(timestamp)
# 转换整数为时间类型
epoch_seconds = 1909130400 # 2030-07-01 18:00:00的时间戳
timestamp = pd.to_datetime(epoch_seconds, unit='s')
print(timestamp)
# 转换列表为时间类型
date_list = ['2030-06-30', '2030-07-01', '2030-07-02']
timestamps = pd.to_datetime(date_list)
print(timestamps)
基于现有列转换对象
import pandas as pd
# 创建示例DataFrame
df = pd.DataFrame({
'Year': [2030, 2030, 2030],
'Month': [6, 7, 8],
'Day': [30, 1, 15],
'Hour': [8, 12, 18]
})
# 将多列转换为DatetimeIndex对象
df['DateTime'] = pd.to_datetime(df[['Year', 'Month', 'Day', 'Hour']])
# 打印转换后的结果
print(df)
时间类型转成字符串
import pandas as pd
timestamp = pd.Timestamp('2023-06-30')
date_string = timestamp.strftime('%Y-%m-%d')
print(date_string)
时间类型转成数值
import pandas as pd
timestamp = pd.Timestamp('2023-06-30')
epoch_seconds = timestamp.timestamp()
print(epoch_seconds)
使用 pd.Timestamp()直接转换
import pandas as pd
# 创建示例DataFrame
df = pd.DataFrame({'date': ['2030-06-30', '2030-07-01', '2030-07-02']})
# 将日期字符串转换为Timestamp对象
df['date'] = df['date'].apply(pd.Timestamp)
# 打印转换后的结果
print(df)
七、DatetimeIndex 类的使用 时间索引的使用
DatetimeIndex 是Pandas中用于表示时间序列的索引类。它是由一系列时间戳(Timestamp)组成的索引,它提供了许多方便的属性和方法,用于对时间序列进行操作和分析,是一些常用的 DatetimeIndex 对象可直接引用的属性:
1、year :返回索引中每个时间戳对应的年份。
2 、month :返回索引中每个时间戳对应的月份。
3 、day :返回索引中每个时间戳对应的日期。
4、 hour :返回索引中每个时间戳对应的小时数。
5、 minute :返回索引中每个时间戳对应的分钟数。
6 、second :返回索引中每个时间戳对应的秒数。
7 、microsecond :返回索引中每个时间戳对应的微秒数。
8、 nanosecond :返回索引中每个时间戳对应的纳秒数。
9 、weekday :返回索引中每个时间戳对应的星期几(0表示星期一,6表示星期日)。
10 、week :返回索引中每个时间戳对应的一年中的第几周。
11、 quarter :返回索引中每个时间戳对应的季度。
12、 is_leap_year :返回索引中每个时间戳对应的年份是否是闰年。
13 、days_in_month :返回索引中每个时间戳对应的月份的天数。
14 、days_in_year :返回索引中每个时间戳对应的年份的天数。
import pandas as pd
# 创建示例时间序列
dates = ['2030-06-30', '2030-07-01', '2030-
07-02', '2030-07-03']
data = [1, 2, 3, 4]
# 创建带有DatetimeIndex的Series
series = pd.Series(data,
index=pd.to_datetime(dates))
print(series)
# 访问DatetimeIndex的属性
print(series.index.year)
print(series.index.month)
print(series.index.day)
print(series.index.weekday)
date_range方法
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None)
1、start :可选参数,表示生成日期范围的起始日期。可以是字符串、 Timestamp 对象或其他可解析为日期的对象。如果未指定,则默认为 None 。
2、end :可选参数,表示生成日期范围的结束日期。可以是字符串、 Timestamp 对象或其他可解析为日期的对象。如果未指定,则默认为 None 。
3、periods :可选参数,表示生成日期范围的长度(周期数量)。当 start 和 end 都未指定时,需要指定 periods 参数。如果指定了 start 和 end ,则忽略 periods 。
4、freq :可选参数,表示日期范围的频率。可以是字符串(例如,'D’表示天,'H’表示小时)或DateOffset 对象。如果未指定,则默认为 None ,表示按日生成日期范围。
5、tz :可选参数,表示日期范围的时区。可以是字符串(例如,‘Asia/Shanghai’)或
pytz.timezone 对象。
import pandas as pd
# 生成日期范围
date_range = pd.date_range(start='2030-06-30', end='2030-07-05', freq='D')
print(date_range)
# 加载数据时指定
#读取文件指定时间索引
df =pd.read_excel('date_test.xlsx',index_col='date')
df = pd.read_excel('./date_test.xlsx', index_col='date')
# 通过时间索引进行筛选
# df.loc['2030']
# df.loc['2030-01']
df.loc['2030-01' : '2030-02']
八、时间序列的使用
resample()
在Pandas中用于重采样时间序列数据的方法。它可以将时间序列数
据转换为不同的频率,例如从分钟级别转换为小时级别或从日级别
转换为月级别。
resample() 方法可以与聚合函数(如 sum() 、 mean() 、 max() 等)一起使
用,对时间序列数据进行聚合操作。
dataframe.resample(rule, axis=0, closed=None,label=None, convention=‘start’, kind=None)
1、rule :表示重采样的频率,可以是字符串(如’D’表示按日重采
样,‘H’表示按小时重采样)或 DateOffset 对象。
例如,使用’5T’表示按5分钟重采样,使用’M’表示按月重采样字符串规则表示重采样的频率,可以是以下常用的字符串值之一:
‘D’ :按日重采样
‘W’ :按周重采样
‘M’ :按月重采样
‘Q’ :按季度重采样
‘A’ :按年重采样
‘H’ :按小时重采样
‘T’ 或 ‘min’ :按分钟重采样
‘S’ :按秒重采样
‘L’ 或 ‘ms’ :按毫秒重采样
‘U’ :按微秒重采样
‘N’ :按纳秒重采样
2、axis :可选参数,用于指定在哪个轴上进行重采样,默认为0,即按行进行重采样。
3、closed :可选参数,用于指定重采样的区间闭合方式,默认为None,表示左闭右开区间。
4、label :可选参数,用于指定重采样结果的标签位置,默认为None,表示使用区间的左侧作为标签。
4、convention :可选参数,用于指定重采样过程中区间边界的约定方式,默认为’start’,表示左开右闭约定。
5、kind :可选参数,用于指定重采样结果的数据结构类型,默认为None。
import pandas as pd
# 创建示例时间序列数据
dates = pd.date_range(start='2023-06-01', end='2023-06-30', freq='D')
values = [1, 2, 3, 4, 5, 6]
series = pd.Series(values, index=dates)
# 按周重采样并计算总和
weekly_sum = series.resample('W').sum()
print(weekly_sum)
shift()方法
是Pandas中的一个方法,用于将DataFrame或Series中的数据沿着指定的轴按给定的位移数进行元素移动。
它可以用于实现数据的时间序列滞后或提前,或者在其他需要移动数据的情况下进行操作:
df.shift(periods=1, freq=None, axis=0, fill_value=None)
periods :表示要移动的位移数,可以是正整数或负整数。正整数表示数据向后移动,负整数表示
数据向前移动。
1、freq :可选参数,用于指定时间序列数据的频率,以便在进行移动时保持时间间隔的一致性。如果不指定,则默认为None。
2、axis :可选参数,用于指定移动的轴。默认为0,表示按行进行移动;1表示按列进行移动。
3、fill_value :可选参数,用于指定在移动过程中新增的位置上要填充的值。默认为None,表示填充NaN。
# 初始化数据
df = pd.read_excel('date_test.xlsx', index_col='date')
# df.index.year
# dfg = df.groupby(df.index.year)
# dfg
# dfg.mean()
# 通过resample进行采样
# df.resample('Y').mean() # 每两年取样
# df.resample('2Y').mean()
# df.resample('2M').min()
# df[~df.index.duplicated()] # 获取不重复的数据
# 将不重复的数据进行采样
# df[~df.index.duplicated()].reindex(index)
# 将不重复的数据进行采样进行重建索引并填充缺失值
df[~df.index.duplicated()].reindex(index, method='bfill')
九、数据特征分析探索
分类变量的频数统计
在Pandas中用于计算Series中各个唯一值出现次数的方法。
它返回一个新的Series,其中索引是唯一值,值是对应唯一值出现的次数,按照出现次数从高到低排序。
series.value_counts(normalize=False,sort=True, ascending=False, bins=None, dropna=True)
1、normalize :可选参数,用于指定是否返回相对频率而不是绝对频数。默认为False,返回绝对频数。
2、sort :可选参数,用于指定是否按照频数进行排序。默认为True,按照频数从高到低排序。
3、ascending :可选参数,用于指定排序顺序。默认为False,按照频数从高到低排序。
4、bins :可选参数,用于指定连续型数据的分箱数。当数据为连续型时,可以指定分箱数将数据离散化并计算频数。
5、dropna :可选参数,用于指定是否忽略缺失值。默认为True,忽略缺失值。
import pandas as pd
# 创建示例 DataFrame
data = {
'Category': ['Clothing', 'Electronics','Electronics', 'Furniture', 'Clothing', 'Furniture']
}
df = pd.DataFrame(data)
# 计算每个类别出现的次数
category_counts = df['Category'].value_counts()
print(category_counts)
其它需要了解的
count方法:计算非缺失值的个数
import pandas as pd
# 创建一个包含缺失值的 Series
series = pd.Series([1, 2, None, 4, None, 6])
# 计算非缺失值的个数
count = series.count()
print(count)
unique方法:返回 Series 中的唯一值
import pandas as pd
# 创建一个包含重复值的 Series
series = pd.Series([1, 2, 2, 3, 3, 4, 4])
# 获取唯一值
unique_values = series.unique()
print(unique_values)
nunique方法:计算 Series 中的唯一值的个数
import pandas as pd
# 创建一个包含重复值的 Series
series = pd.Series([1, 2, 2, 3, 3, 4, 4])
# 计算唯一值的个数
unique_count = series.nunique()
print(unique_count)
mode方法:返回 Series 中的众数(出现频率最高的值)
import pandas as pd
# 创建一个包含重复值的 Series
series = pd.Series([1, 2, 2, 3, 3, 4, 4])
# 获取众数
mode_values = series.mode()
print(mode_values)
十、数据交叉表与透视表
1、pivot_table() 方法
用于根据指定的行和列索引对数据进行透视,并应用聚合函数对数值进行汇总。它可以根据数据的某些特征生成新的表格,提供更直观和方便的数据分析。
df.pivot_table(values=None, index=None,columns=None, aggfunc=‘mean’,fill_value=None, margins=False, dropna=True)
应用场景
1、根据不同的行和列进行数据透视和汇总。
2、分析和比较不同组合下的统计指标。
3、生成透视表以便更好地理解数据的关系和趋势。
2、crosstab()方法
用于计算两个或多个因素之间的交叉表,即两个或多个变量之间的
频数或统计信息表。
它可以帮助我们了解不同因素之间的关系和分布情况:
pd.crosstab(index, columns, values=None,rownames=None, colnames=None, aggfunc=None,margins=False, dropna=True, normalize=False)
应用场景
分析不同因素之间的关系和分布情况。
统计分类变量之间的交叉频数。
比较不同组合下的统计指标。
import pandas as pd
# 创建示例 DataFrame
data = {
'Category': ['服装', '电子产品', '电子产品','家具', '服装', '家具'],
'Location': ['A', 'B', 'A', 'B', 'B','A'],'Sales': [100, 200, 150, 300, 250, 200]
}
df = pd.DataFrame(data)
# 使用 pivot_table() 方法生成透视表
pivot_table = df.pivot_table(values='Sales', index='Category', columns='Location', aggfunc='sum')
print(pivot_table)
# 使用 crosstab() 方法生成交叉表
crosstab_table = pd.crosstab(index=df['Category'],columns=df['Location'], values=df['Sales'], aggfunc='sum')
print(crosstab_table)
df1 = pd.read_excel('./stu_data.xlsx')
# 透视表 默认会对数据进行求平均值
# df1.pivot_table(index='课程', values='支出', aggfunc=['sum','mean'])
# 课程和性别结合起来的支出
# df1.pivot_table(index='课程', columns='性别', values='支出', aggfunc=['sum','mean'])
# df1.pivot_table(index=['课程','软件'], columns='性别', values='支出', aggfunc='mean')
# df1.pivot_table(index=['课程','软件'], columns=['性别', '开设'], values='支出', aggfunc='mean')
df1.pivot_table(index=['课程','软件'], columns=['性别', '开设'], values=['支出','身高'], aggfunc='mean')
df = pd.read_excel('./stu_data.xlsx')
# 交叉表
# pd.crosstab(index=df.课程, values=df.支出, columns=df.性别, aggfunc='mean')
pd.crosstab(index=[df.课程, df.开设], values=df.支出, columns=[df.性别,df.软件], aggfunc='mean')