一、pandas库的Series类型
1、初始化
1、一维Series可以用一维列表初始化
a=pd.Series([1,3,5,np.nan,6,5])
2、索引
1、默认的情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的
b=pd.Series([1,3,5,np.nan,6,5],index=['a','b','c','d','e','f'])
print(b)
2、索引——数据行标签
a.index
3、取值
a.values
4、切片
a[2:5]
5、索引赋值
a.index=list('abcdef')
6、根据默认索引取值
ser.value_count().index[0:2]
3、查看数据
1)Series.take(参数)
Series.take(indices, axis=0, convert=None, is_copy=True, **kwargs)
参数说明:
参数 | 说明 |
---|---|
indices | 一个整数数组,指示要采取的位置。 |
axis | 选择元素的轴。0:行,1:列 |
convert | 是否将负指数转换为正指数 |
is_copy | 是否返回原始对象的副本。 |
Series.take(indices, axis=0, convert=None, is_copy=True, **kwargs)
例:
sr = pd.Series(['New York', 'Chicago', 'Toronto', 'Lisbon', 'Rio', 'Moscow'])
sr.take(indices = [0, 2])#获取了sr中第1个和第3元素
二、DataFrame类型
1、初始化
1)传入二维数组
df=pd.DataFrame(np.random.randn(6,4))
df ##默认使用0、1、2.。。作为索引index
2)传入一个字典
df1=pd.DataFrame({
'A':1,'B':pd.Timestamp('20200101'),'C':pd.Series(1,index=list(range(4)),dtype=float),'D':np.array([3]*4,dtype=int),'E':pd.Categorical(['test','train','test','train']),'F':'abc'})
df1
3)读取文件
df_mv=pd.read_excel(r'路径')
4)列表重塑
li.reshape
#将系列重塑ser为具有 7 行 5 列的数据框
ser = pd.Series(np.random.randint(1, 10, 35))
df=pd.DataFrame(ser.values.reshape(7,5))
2、索引
1)df.columns=[列标]
设值列表
2)df.index=[行号]
3)df.loc[[index],[column]]
df.loc[[index],[column]]通过标签选择数据
df.loc[[index],[column]]通过标签选择数据
df_mv.loc[[1,3,4],['名字','评分']]
4)条件选择
df_mv[df_mv['产地']=='中国大陆'][:5]
df_mv[(df_mv.产地=='美国')&(df_mv.评分>9)].head()
df_mv[((df_mv.产地=='美国')|(df_mv.产地=='中国大陆'))&(df_mv.评分>9)].head()
5)df.rename()
于更改行列标签,即行和列的索引,可以传入一个字典或则一个函数。
df.rename(index={
...}columns={
...})
df.rename()用于更改行列标签,即行和列的索引,可以传入一个字典或则一个函数。
df.rename(lambda x:x+11)#索引从11开始排
df.rename(index={
0:'a',1:'b'})
6)df.reindex()
重新索引:DataFrame
DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
参数说明:
参数 | 说明 |
---|---|
labels | 新标签/索引使“ axis”指定的轴与之一致。 |
index, columns | 要符合的新标签/索引。最好是一个Index对象,以避免重复数据 |
axis | 轴到目标。可以是轴名称(“索引”,“列”)或数字(0、1)。 |
method | {None,“ backfill” /“ bfill”,“ pad” /“ ffill”,“ nearest”},可选 |
copy | 即使传递的索引相同,也返回一个新对象 |
level | 在一个级别上广播,在传递的MultiIndex级别上匹配索引值 |
fill_value | 在计算之前,请使用此值填充现有的缺失(NaN)值以及成功完成DataFrame对齐所需的任何新元素。如果两个对应的DataFrame位置中的数据均丢失,则结果将丢失。 |
limit | 向前或向后填充的最大连续元素数 |
tolerance | 不完全匹配的原始标签和新标签之间的最大距离。匹配位置处的索引值最满足方程abs(index [indexer]-target) |
df.reindex(range(len(df)))
7)df.set_index()
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数说明:
参数 | 说明 |
---|---|
keys | 列标签或列标签/数组列表,需要设置为索引的列 |
drop | 默认为True,删除用作新索引的列 |
append | 是否将列附加到现有索引,默认为False。 |
inplace | 输入布尔值,表示当前操作是否对原数据生效,默认为False。True:即改变原来的索引 |
verify_integrity | 检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为false将提高该方法的性能,默认为false。 |
#将PassengerId设置为索引
df.set_index('PassengerId')
3、查看数据
1)df.head(n)
2)df.tail(n)
head和tail方法可以分别查看最前面几行和最后面几行的数据(默认为5)
3)df.index
下标使用index属性查看
4)df.columns
列标使用columns属性查看
5)df.values
数据值使用values查看
6) df.iloc[索引/切片]
显示行,左闭右开
7)df.loc[[行],[列]]
选择数据,左闭右闭
8)df.shape
显示现状
9)df.ndim
显示维度
10)df[列].dtype
列数据类型
11)df.info()
相关信息概览
12)df.describe()
综合统计结果
13)df.loc[a1,a2]
标签索引:只能是定标签名字,即自定义索引
参数说明:
参数 | 说明 |
---|---|
a1 | 行标签,可以切片,也可以为一个列表 |
a2 | 列标签,可以切片,也可以为一个列表 |
14)df.iloc[a1,a2]
位置索引:只能通过原始的索引,不能使用自定义索引
参数说明:
参数 | 说明 |
---|---|
a1 | 行标签,可以切片,也可以为一个列表 |
a2 | 列标签,可以切片,也可以为一个列表 |
15)df.ix[a1,a2]
混合索引:即可用位置索引,也可以用户标签索引
16)df.query()
df.query(expr, inplace = False, **kwargs)
参数说明:
参数 | 说明 |
---|---|
expr | 要评估的查询字符串; 可以在环境中引用变量,在变量前面加上@字符(@a+b); 也可以通过在反引号中将空格或运算符括起来来引用它们 |
inplace | 查询是应该修改数据还是返回修改后的副本 |
1 # 查询B列中数值为2的行记录
print(df.query('B == 2'))
2 #查询A列数值小于B列的行记录
print(df.query('A < B'))
# 等价于
print(df[df.A < df.B])
3 #查询B列数值和C C列相等的行记录
#注:对于名称中带有空格的列名,python2可以用反引号引用,但是python3已经取消了,所以可以用下面的方法
print(df[df.B == df['C C']])
4 #查询A列小于B列,且A列小于C C列的数据
#注意对于C C列的列名中间有空格或运算符等其他特殊符号的情况,上文提到,要用反引号(就是键盘上第二排第一个按键,有‘~’这个符号的按键)。
df.query('A < B & A < `C C`')
17)df.dtypes
查看各列(Series)类型
#查看每个列的数据类型
pokemon.dtypes
18)s.unique()
获取唯一值,返回一个列表
df['item_name'].unique()#返回该列所有唯一值,一个列表
19)s.nunique()
获取唯一值的个数,返回一个数字,可用于DataFrame
df['item_name'].nunique()#返回一个数字
df.nunique()#作用于dataframe,返回各列唯一值的数量
out:order_id 1834
quantity 9
item_name 50
choice_description 1043
item_price 78
dtype: int
20)s.vlaue_counts()
计算每个唯一值的频率计数。
value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列或行使用
默认是会降序的
df['年代'].value_counts()[:10]#计算列取重后的值数量
#在choice_description中,下单次数最多的商品是什么?
df['choice_description'].value_counts().head(1)
21)df.filter()
df.filter(items=None, like=None, regex=None, axis=None)
参数说明:
参数 | 说明 |
---|---|
item | 对列进行筛选 |
like | 表示用正则进行匹配 |
regex | 进行筛选 |
axis | axis=0表示对行操作,axis=1表示对列操作 |
其中的参数 items, like, 和 regex parameters 被强制执行为相互排斥,即只能有一个存在
22)df.any() and df.all()
1、df.all(axis=0, bool_only=None, skipna=True, level=None)
返回是否所有元素都为真(可能在轴上),即都为镇才返回
参数说明:
参数 | 说明 |
---|---|
axis | 0或’index’;1或’columns’;None。默认为0。指出哪个轴应该减少。0或’index’:减少索引,返回索引为原始列标签的Series。1或’columns’:减少列,返回一个索引为原始索引的Series。None:减少所有轴,返回一个标量。 |
skipna | 默认 True,排除NA/null值。如果整个row/column为NA,并且skipna为True,那么对于空row/column,结果将为True。如果skipna是False,那么NA就被当作True,因为它们不等于零。 |
2、df.any(axis=0, bool_only=None, skipna=True, level=None)
返回是否至少一个元素为真,即有一个为真则返回
23)s.diff()
计算相对于当前的前一个值的差,本行与前一行的差
#计算前一天与后一天收盘价的差值
df['收盘价(元)'].diff()
#等价于
df['收盘价(元)']-df.shift()['收盘价(元)']
24)s.pct_chang()
计算与前一行的变化量
#计算前一天与后一天收盘价变化率
df['收盘价(元)'].pct_change()
#计算前两天的收盘价变化率
df['收盘价(元)'].pct_change(2)
3、数据操作
1)行的 操作
1、查看行数据
df_mv.iloc[0]
df_mv.iloc[0:5]#左闭又开
df_mv.loc[0:5]#左闭右闭
2、添加一行
dit={
'名字':'复仇者联盟3',
'投票人数':123456,
'类型':'剧情/科幻',
'产地':'美国',
'上映时间':'2017-05-04 00:00:00',
'时长':142,
'年代':2017,
'评分':8.7,
'首映地点':'美国'}
s=pd.Series(dit)
s.name=38738
df_mv=df_mv.append(s)
3、删除一行
df_mv=df_mv.drop([行号])
4、df.drop()
df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
参数说明:
参数 | 说明 |
---|---|
labels | 待删除的行名or列名; |
axis | 删除时所参考的轴,0为行,1为列;默认是0 |
index | 待删除的行名 |
columns | 待删除的列名 |
level | 多级列表时使用,暂时不作说明 |
inplace | 布尔值,默认为False,这是返回的是一个copy;若为True,返回的是删除相应数据后的版本 |
2)列的操作
1、查看列数据
df_mv['列名'][0:5]
df_mv[['列1','列2']][:5]
2、增加一列
df_mv['列名']=range(1,len(df_mv)+1)列每行的内容
3、插入一列 df.insert()
DataFrame.insert(loc, column, value, allow_duplicates=False)
参数 | 说明 |
---|---|
loc | 参数column插入的位置,如果想插入到第一例则为0,取值范围: 0 <= loc <= len(columns),其中len(columns)为Dataframe的列数 |
column | 给 插入数据value取列名,可为数字,字符串等 |
value | 可以是整数,Series或者数组等 |
allow_duplicates | 默认 False,如果想完成重复值的插入需要把allow_duplicates设置为True |
df.insert(想要插入的索引,列名,数据) # 数据可以为数组或Series
frame.insert(0, 'num', np.ones(5))
4、删除一列
df_mv=df_mv.drop('序号',axis=1)
3)移动行或列
df.shift()
df.shift()#整体向下移动一行,顶行填充nan
df.shift(3)#整体向下移动三行,顶部填充nan
df.shift(-1)#向上移动一行
df.shift(1,axis=1)#向右移动一列
df.shift(-1,asis=1)#向左移动一列
df['收盘价(元)']-df.shift()['收盘价(元)']#实现了df['收盘价(元)'].diff()
4、对齐运算
使用后df+df默认的是有相同标签的会相加,没有则以nan填充,其他也类似
单词:
单词 | 意思 |
---|---|
add | 加 |
subtract | 减 |
multiply | 乘 |
divide | 除 |
power | 乘方 |
算术运算表:
方法 | 描述 |
---|---|
add,radd | 加法(+) |
sub,rsub | 减法(-) |
div,rdiv | 除法(/) |
floordiv,rfloordiv | 整除(//) |
mul,rmul | 乘法(*) |
pow,rpow | 幂次方(**) |
注释: | 带有r开头的表示它运算会翻转,后面的算数前面的,如df1.div(df2)表示df1/df2,而df1.rdiv(df2)表示df2/df1 |
df1.add(df2,)
df1.add(df2,level=None, fill_value=None, axis=0)
返回算数运算的结果
参数说明:
参数 | 说明 |
---|---|
fill_value | 添加前要在系列/列表中用NaN替换的值,如果两个df对应的行列都为nan则返回nan |
level | 多索引时级别的整数值 |
df1.add(df2,fill_value=0) # df1加df2,如果有nan则填充为0运算
df1.sub(df2,fill_value=0) # df1减df2,如果有nan则填充为0运算
df1.mul(df2,fill_value=0) # df1乘df2,如果有nan则填充为0运算
df1.div(df2,fill_value=0) # df1除df2,如果有nan则填充为0运算
三、数据清洗
函数 | 描述 |
---|---|
df.isnull | 返回一个布尔值对象,判断哪些值是缺失值 |
df.notnull | isnull的否定式 |
df.fillna | 对缺失值进行填充 |
df.dropna | 根据标签中的缺失值进行过滤,删除缺失值 |
1、缺失值处理
1)判断缺失值
df.isnull()
df_mv[df_mv['名字'].isnull()].head()
df.isnull().sum().sort_values(ascending=False)#判断每一列的缺失值个数,并降序排序
2)填充缺失值
df.fillna()
fillna参数说明:
参数 | 说明 |
---|---|
inplace | True:直接修改原对象,False:创建一个副本,修改副本,原对象不变(缺省默认) |
method | 取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None, pad/ffill:用前一个非缺失值去填充该缺失值,向前填充, backfill/bfill:用下一个非缺失值填充该缺失值,向后填充 None:指定一个值去替换缺失值(缺省默认这种方式) |
limit | 限制填充个数 |
axis | 修改填充方向 |
df_mv['名字'].fillna('未知电影',inplace=True)
3)删除缺失值
df.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
dripna参数说明:
参数 | 说明 |
---|---|
axis | {0 or ‘index’, 1 or ‘columns’}, default 0,0 or ‘index’:删除包含丢失值的行, 1, or ‘columns’:删除包含丢失值的列 |
how | {‘any’, ‘all’}, default ‘any’,‘any’: 只要有缺失值出现,就删除,‘all’: 所有的值都缺失,才删除 |
thresh | int,保留含有int个非空值的行,如果缺失值(NaN)的数量大于thresh,将删除 |
subset | 对特定的列进行缺失值删除处理,传入列表 |
inplace | True:直接修改原对象,False:创建一个副本,修改副本,原对象不变(缺省默认) |
df_mv1=df_mv.dropna()
4)插值填充
1、df.interpolate()
DataFrame.interpolate(method=‘linear’, axis=0, limit=None, inplace=False, limit_direction=None, limit_area=None, downcast=None, **kwargs)
参数说明:
参数 | 说明 |
---|---|
method | str,默认为‘linear’使用插值方法。 ‘linear’:忽略索引,线性等距插值。这是MultiIndexes支持的唯一方法。 ‘time’: 在以天或者更高频率的数据上插入给定的时间间隔长度数据。 ‘index’, ‘values’: 使用索引的实际数值。 ‘pad’:使用现有值填写NaN。 ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’: 传递给 scipy.interpolate.interp1d。这些方法使用索引的数值。‘polynomial’ 和 ‘spline’ 都要求您还指定一个顺序(int),例如 ,df.interpolate(method=‘polynomial’, order=5) ‘krogh’,‘piecewise_polynomial’,‘spline’,‘pchip’,‘akima’:包括类似名称的SciPy插值方法。 ‘from_derivatives’:指 scipy.interpolate.BPoly.from_derivatives,它替换了scipy 0.18中的’piecewise_polynomial’插值方法。 |
axis | {0或’index’,1或’columns’,None},默认为None;沿轴进行interpolate。 |
limit | int;要填充的连续NaN的最大数量。必须大于0。 |
inplace | bool,默认为False;如果可以,更新现有数据。 |
limit_direction | {‘forward’,‘backward’,‘both’},默认为’forward’;如果指定了限制,则将沿该方向填充连续的NaN。 |
limit_area | {None, ‘inside’, ‘outside’}, 默认为None;如果指定了限制,则连续的NaN将填充此限制。 None:无填充限制。 ‘inside’:仅填充有效值包围的NaN。 ‘outside’: 仅在有效值之外填充NaN。 |
s = pd.Series([0, 1, np.nan, 3])
s.interpolate()#线性等距插nan值
5)异常值处理
对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZ35DDk6-1640316998300)(图片\屏幕截图 2021-09-30 094301.png)]
6)重复值判断
df.duplicated(subset=None, keep=‘first’)
返回Boolean
参数说明:
subset=None | 列标签或标签序列,可选# 只考虑某些列来识别重复项;默认使用所有列 |
keep | {‘first’,‘last’,False} # - first:将第一次出现重复值标记为True # - last:将最后一次出现重复值标记为True # - False:将所有重复项标记为True |
7)删除重复值
data.drop_duplicates(subset=[‘A’,‘B’],keep=‘first’,inplace=True)
参数说明:
参数 | 说明 |
---|---|
subset | 列名,可选,默认为None |
keep | {‘first’, ‘last’, False}, 默认值 ‘first’ first: 保留第一次出现的重复行,删除后面的重复行。 last: 删除重复项,除了最后一次出现。 False: 删除所有重复项。 |
inplace | 布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。 (inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。) |
单词:
单词 | 意思 |
---|---|
replication | 复制 |
duplicate | 无关要的)重复(某事),复制 |
inplace | 原地 |
keep | 保持,处于 |