写点什么

python pandas 库统计分析基础必备知识汇总,2021Python 网络编程总结篇

作者:程序媛可鸥
  • 2022 年 3 月 19 日
  • 本文字数:5508 字

    阅读完需:约 18 分钟

print(s4[1:4])





1.5Series 的 index 和 values 属性




Series 对象有 index 和 value 属性,可直接调用进行查看。


import pandas as pd


s1 = pd.Series([50, 56, 74, 85])


print(s1.index)


print(s1.values)





2.DataFrame


=================================================================================


2.1 创建一个 DataFrame 对象



2.1.1 不指定 index 和 columns

当不指定 index 和 columns 时,默认为 0, 1, 2。


import pandas as pd


data = [[120, 115, 109], [101, 100, 112], [106, 110, 125]]


df = pd.DataFrame(data=data)


print(df)


2.1.2 指定 index 和 columns

import pandas as pd


data = [[120, 115, 109], [101, 100, 112], [106, 110, 125]]


index = [0, 1, 2]


columns = ['AAA', 'BBB', 'CCC']


df = pd.DataFrame(data=data, index=index, columns=columns)


print(df)


2.1.3 使用字典创建 DataFrame

键为列名,值为该列数据组成的列表。值也可以是单个元素,表示该列都取该值。


import pandas as pd


df = pd.DataFrame({


'AAA': [120, 101, 106],


'BBB': [115, 100, 110],


'CCC': [109, 112, 125],


'DDD': 'ABCDEFG'


}, index=[0, 1, 2])


print(df)



2.2 遍历 DataFrame 对象数据的每一列




for col in df.columns:


series = df[col]


print(series)



2.3 索引与切片



2.3.1 loc 标签索引

2.3.1.1 获取单行数据

import pandas as pd


df = pd.DataFrame({


'AAA': [120, 101, 106, 117, 114, 122],


'BBB': [115, 100, 110, 125, 123, 120],


'CCC': [109, 112, 125, 120, 116, 115],


'DDD': 'ABCDEFG'


}, index=[1, 2, 3, 4, 5, 6])


print(df)


print("=======================")


print(df.loc[1])


df.loc[1]获取到标签索引为 1 的数据,在这里即第一行的。


2.3.1.2 获取多行数据

print(df)


print("=======================")


print(df.loc[[1, 3]])


2.3.1.3 切片连续多行数据

标签索引切片时左右边界的值都可以取。


print(df)


print("=======================")


print(df.loc[1:5])


2.3.2iloc 位置索引

2.3.2.1 获取某行数据

import pandas as pd


df = pd.DataFrame({


'AAA': [120, 101, 106, 117, 114, 122],


'BBB': [115, 100, 110, 125, 123, 120],


'CCC': [109, 112, 125, 120, 116, 115],


'DDD': 'ABCDEFG'


}, index=[1, 2, 3, 4, 5, 6])


print(df)


print("=======================")


print(df.iloc[1])


df.iloc[1]获取到第二行(下标为 1)数据


2.3.2.2 获取多行数据

print(df)


print("=======================")


print(df.iloc[[0, 2]])


2.3.2.3 切片连续多行数据(左闭右开)

遵照左闭右开


print(df)


print("=======================")


print(df.iloc[1: 4])



某行(第二行)至最后一行


print(df)


print("=======================")


print(df.iloc[1:])



(或 df.iloc[1::]写法也可)



2.3.3 直接获取指定列数据

  • 直接传入列名即可获取

2.3.3.1 获取单列

获取单列有两种写法如下,结果有所不同


print(df)


print("=======================")


print(df['AAA'])


print(type(df['AAA']))



print(df)


print("=======================")


print(df[['AAA']])


print(type(df[['AAA']]))



根据程序运行结果,df[‘AAA’]得到的是一个 Series,而 df[[‘AAA’]]得到的结果是一个 DataFrame。

2.3.3.2 获取多列

print(df)


print("=======================")


print(df[['AAA', 'CCC']])


2.3.4 获取指定行、列数据

通过以下几个示例,来熟悉 loc 和 iloc 同时指定行和列时的用法。


对于 loc 和 iloc,只有标签和位置索引的区别。同时指定行和列时,如果某个维度(行或列)的索引为离散的单个或多个元素,则需要额外加上方括号(loc[[2,4],[‘a’,‘c’]] 或 iloc[[5,8],[2,6]]);如果是切片形式的(形如 a:b, a,b 也可省略),则不需要额外的方括号(loc[2:4,‘a’:‘c’] 或 iloc[5:8,2:6])。

2.3.4.1 loc 标签索引

获取索引为 2 的行到索引为 4 的行(两端都取),与列名为"AAA"的列和列名为"CCC"的列交叉的部分


print(df)


print("=======================")


print(df.loc[2:4, ['AAA', 'CCC']])



获取所有行中,列明为"AAA"和列明为“CCC”的部分


print(df)


print("=======================")


print(df.loc[:, ['AAA', 'CCC']])



获取所有行中,列名“BBB”及其后边的列的部分


print(df)


print("=======================")


print(df.loc[:, 'BBB':])



print(df)


print("=======================")


print(df.loc[[1, 3], ['BBB', 'DDD']])


2.3.4.2 iloc 位置索引

print(df)


print("=======================")


print(df.iloc[:, [1, 3]])



print(df)


print("=======================")


print(df.iloc[:, :2])



print(df)


print("=======================")


print(df.iloc[[2, 5], [1, 3]])


2.3.5 按指定条件获取(布尔索引)

使用 loc 还可以进行指定条件的筛选获取


执行以下代码


print(df)


print("=======================")


print(df['AAA'] > 110)


print(type(df['AAA'] > 110))


如图,输出了一个 value 为 bool 类型数据的 Series 对象。



可以使用该种形式的 Series 对 DataFrame 进行筛选


print(df)


print("=======================")


print(df.loc[df['AAA'] > 110])



也可以传入多个条件进行筛选。每个条件需要使用括号()括起来。


以获取’AAA’大于 110 且’CCC’大于 115 的为例:


print(df)


print("=======================")


print(df.loc[(df['AAA'] > 110) & (df['CCC'] > 115)])



2.4 增加数据



2.4.1 按列增加数据

2.4.1.1 直接添加

print(df)


print("=======================")


df['EEE'] = [140, 133, 145, 125, 126, 133]


print(df)



也可以使用 loc 添加


添加一整列时行索引必须是所有行,列索引是一个新的列名。添加的数据个数必须等于总行数。插入的数据在最后一列。


print(df)


print("=======================")


df.loc[:, 'FFF'] = [84, 99, 76, 50, 20, 66]


print(df)



如果行索引是部分行,且列索引已存在于原数据中,则效果为修改局部数据。


print(df)


print("=======================")


df.loc[1:4, 'CCC'] = [99, 76, 50, 20]


print(df)


使用 insert()方法添加

在第 1 列后添加一个名为’SSS’的列,数据为 s1 中的数据。


print(df)


print("=======================")


s1 = [99, 89, 95, 84, 110, 104]


df.insert(1, 'SSS', s1)


print(df)


2.4.2 按行增加数据

2.4.2.1 增加一行

print(df)


print("=======================")


df.loc['100'] = [111, 132, 99, 123]


print(df)


2.4.2.2 增加多行数据

将新数据创建一个格式一致的、新的 DataFrame,然后使用 append 方法追加在原数据后边。


print(df)


print("=======================")


df_insert = pd.DataFrame({'AAA': [102, 124, 133, 120, 115, 121],


'BBB': [110, 125, 140, 111, 117, 126],


'CCC': [112, 118, 122, 114, 136, 125],


'DDD': 'XYZ'}


, index=[10, 20, 30, 40, 50, 60])


df1 = df.append(df_insert)


print(df)


print("============================")


print(df1)



如图,使用 append 方法对一个 DataFrame 在后边追加一个 DataFrame,不会改变原 DataFrame,这一点不同于列表追加元素。


2.5 修改列名 &索引



2.5.1 修改列名

2.5.1.1 通过 DataFrame 的 columns 属性

print(df)


print("=======================")


df.columns = ['A1', 'B2', 'C3', 'V4']


print(df)


2.5.1.2 通过 DataFrame 的 rename()方法

print(df)


print("=======================")


df.rename(columns={'AAA': 'A1', 'BBB': 'B2', 'CCC': 'C3'}, inplace=True)


print(df)


inplace 参数表示是否修改原 DataFrame,默认 False 不修改。


2.5.2 修改索引(index)

2.5.2.1 通过 index 属性

print(df)


print("=======================")


df.index = list('abcdef')


print(df)



ng?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L6v5bCP5ZW-,size_13,color_FFFFFF,t_70,g_se,x_16)

2.5.2.2 通过 rename 方法

通过 rename 方法也可以实现对索引的修改。


参数 axis 默认为 0,表示对 index 操作,(所以这里不设置 axis 也可)除非像上边的例子中传入有 columns 参数则表示对列操作。


print(df)


print("=======================")


df.rename({1: 'a1', 2: 'b2', 3: 'c3', 4: 'd4'}, axis=0, inplace=True)


print(df)



2.6 修改数据



2.6.1 使用 loc

修改整行数据

print(df)


print("=======================")


df.loc[3] = [111, 115, 109, 120]


print(df)


print("============================")


df.loc[3] = df.loc[3]+10


print(df)


修改整列数据

print(df)


print("=======================")


df.loc[:, 'CCC'] = [116, 104, 115, 120, 125, 124]


print(df)


修改指定某一数据

print(df)


print("=======================")


df.loc[3, 'BBB'] = 150


print(df)


2.6.2 使用 iloc

修改整行数据

print(df)


print("=======================")


df.iloc[0, :] = [112, 120, 119, 126]


print(df)


修改整列数据

print(df)


print("=======================")


df.iloc[:, 0] = [111, 118, 114, 102, 125, 130]


print(df)


修改指定某一数据

print(df)


print("=======================")


df.iloc[0, 0] = 150


print(df)



2.7 删除数据



2.7.1 删除某列

print(df)


print("=======================")


df.drop(['AAA'], axis=1, inplace=True)


print(df)



print(df)


print("=======================")


df.drop(columns='AAA', inplace=True)


print(df)



删除标签为’BBB’的,axis=1 表示对列操作


print(df)


print("=======================")


df.drop(labels='BBB', axis=1, inplace=True)


print(df)


2.7.2 删除某行

删除标签为 2,4 的行,axis 默认为 0,默认对行操作。


print(df)


print("=======================")


df.drop([2, 4], inplace=True)


print(df)



print(df)


print("=======================")


df.drop(index=3, inplace=True)


print(df)



删除标签为 4 的,axis=0 表示对行操作。


print(df)


print("=======================")


df.drop(labels=4, axis=0, inplace=True)


print(df)


2.7.3 删除特定条件的行

删除字段’AAA’为 120,101 或 114 的行。


print(df)


print("=======================")


df.drop(index=df[df['AAA'].isin([120, 101, 114])].index, inplace=True)


print(df)



删除"BBB"字段小于 120 的行


print(df)


print("=======================")


df.drop(index=df[df['BBB'] < 120].index, inplace=True)


print(df)



2.8 打印 DataFrame 的简短摘要




print(df)


print("=======================")


print(df.info())



2.9 处理缺失值与重复值



2.9.1 处理缺失值

2.9.1.1 准备缺失值

准备两个缺失值

import numpy as np


df.iloc[0, 0] = np.NaN


df.iloc[2, 2] = np.NaN


print(df)


2.9.1.2 删除该缺失值所在行

print(df)


print("====================")

不修改原 df 的写法

df1 = df.dropna()

print(df1)

修改原 df 的写法

df.dropna(inplace=True)


print(df)


2.9.1.3 获取某字段没有缺失值 的行

print(df)


print("=============================")


df2 = df[df['AAA'].notnull()]


print(df2)


2.9.1.4 填充缺失值

以将缺失值填充为 0 为例

2.9.1.4.1 填充所有缺失值

print(df)


print("=============================")


df3 = df.fillna(0)


print(df3)


2.9.1.4.2 填充局部缺失值

print(df)


print("=============================")


df['AAA'] = df['AAA'].fillna(0)


print(df)


2.9.2 处理重复值

2.9.2.1 准备数据

import pandas as pd


df = pd.DataFrame({


'AAA': [120, 101, 106, 101, 101, 122],


'BBB': [115, 100, 110, 100, 100, 120],


'CCC': [109, 112, 125, 112, 112, 115],


'DDD': 'ABCDEFG'


}, index=[1, 2, 3, 4, 5, 6])


print(df)


2.9.2.2 判断重复值

2.9.2.2.1 判断整行数据是否重复

将一行完全相同的判断为重复值,第一次出现的行不会被判定为重复值,第二次及以上次数重复出现的才会。


print(df)


print("=============================")


print(df.duplicated())


2.9.2.2.2 判断某字段数据是否重复

以字段"AAA"为例。


print(df)


print("=============================")


print(df['AAA'].duplicated())

或者

print(df.duplicated(['AAA']))

print("=============================")


print(df.loc[df['AAA'].duplicated()])


2.9.2.3 去重

2.9.2.3.1 删除整行重复值

不更改原 df


print(df)


print("=============================")


df1 = df.drop_duplicates()


print(df1)



更改原 df


print(df)


print("=============================")


df.drop_duplicates(inplace=True)


print(df)


2.9.2.3.2 删除某字段重复 的行

print(df)


print("=============================")


print(df.drop_duplicates(['AAA']))



如果要保留重复行中的最后一行(默认是第一行),须将参数 keep 设置为’last’:


print(df)


print("=============================")


print(df.drop_duplicates(['AAA'], keep='last'))



2.10 设置索引



2.10.1 reindex

缺失值以 0 填充

from pandas import Series


s1 = Series([88, 60, 75], index=[1, 2, 3])


print(s1)


print("========================")


print(s1.reindex([1, 2, 3, 4, 5]))


print("========================")

重新设置索引,NaN 以 0 填充

print(s1.reindex([1, 2, 3, 4, 5],fill_value=0))


缺失值向前/向后填充

from pandas import Series

从 pandas 引入 Series 对象,就可以直接使用 Series 对象了,如 Series([88,60,75],index=[1,2,3])

s1 = Series([88, 60, 75], index=[1, 2, 3])


print(s1)


print("========================")


print(s1.reindex([1, 2, 3, 4, 5], method='ffill')) # 向前填充


print("========================")


print(s1.reindex([1, 2, 3, 4, 5], method='bfill')) # 向后填充


现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到 1 套比较全的学习资源之前,我并没着急去看第 1 节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做 1 个学习计划,我的学习计划主要包括规划图和学习进度表。


分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习



用户头像

Python编程资料加Q群免费领取:419829237 2022.03.14 加入

还未添加个人简介

评论

发布
暂无评论
python pandas库统计分析基础必备知识汇总,2021Python网络编程总结篇_Python_程序媛可鸥_InfoQ写作平台