[AI 基础] Pandas使用总结

前言

Pandas是机器学习三剑客之一,我们知道Numpy能够对数据进行很好的分析、操作、矩阵计算等,Pandas更侧重于数据的处理和分析,它的底层是使用Numpy实现的,在数据处理和分析方面提供了强大的功能。下面就总结一下日常使用操作。

程序运行环境:window10 Python3.7 (Anaconda) Pandas 1.0.1

编辑工具:jupyter

在日常数据分析中,经常使用的是CSV文件,本文也主要记录该文件的相关处理方式。

(补充:默认的csv文件是以“,”隔开的文本文件,使用excel打开时与xls文件类似)

相关文档可参考:Pandas中文文档Pandas英文文档

问题

数据预处理是做数据分析、数据挖掘、机器学习等的第一步。下面以泰坦尼克号乘客信息数据(titanic.csv)数据集做介绍。部分数据展示可参见对应jupyter数据文件。

通常使用pandas读取数据后会返回一个DataFrame数据结构,查看某一列(行)数据的数据类型返回一个Series,也就是说DataFrame由Series组成,读取数据是默认把第一行数据当作列名,可将一个DataFrame认为是一个二维数组数据结构。

# 读取数据
df = pd.read_csv('titanic.csv')
print(type(df))       # <class 'pandas.core.frame.DataFrame'>
# 查看数据
df.head()             # 通常使用该方法查看前5条数据
df.tail()             # 通常使用该方式查看最后5条数据情况
print(type(df['Name']))  # <class 'pandas.core.series.Series'>

查看数据的基本信息

DataFrame提供了info()方法,该方法返回DataFrame数据的样本规模、每列数据信息等。展示如下:

df.info()
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64
memory usage: 83.7+ KB
"""

从结果中可以看出,数据891个实体,默认每一行为一个实体,一共12列,每列的信息也有所展示,例如对应的数据类型,object说明该数据类型为字符串,该文件在读到内存的大小等。

查看数据的统计信息

DataFrame提供了describe()方法,可以查看数据的个数、均值、标准差、最大值、最小值等信息。也可从中看出数据是否存在问题。

df.describe()

查看某列各属性个数

# 查看是否存活的个数
df['Survived'].value_counts()
# 指定按照个数从少到多排序
df['Survived'].value_counts(ascending=True)
# 对于其它具有更多类的数据可以分段显示,参数:bins = n,表示将连续的数据分为5组显示

获取数据的列名

df.columns   # columns为其属性,不是一种方法
"""
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
"""

获取数据的索引

df.index
"""
RangeIndex(start=0, stop=891, step=1)
"""

获取每列数据对应的数据类型

df.dtypes
"""
PassengerId      int64
Survived         int64
Pclass           int64
Name            object
Sex             object
Age            float64
SibSp            int64
Parch            int64
Ticket          object
Fare           float64
Cabin           object
Embarked        object
dtype: object
"""

将DataFrame数据类型转为Numpy类型

df.values  # np.array(df) 也可
"""
array([[1, 0, 3, ..., 7.25, nan, 'S'],
       [2, 1, 1, ..., 71.2833, 'C85', 'C'],
       [3, 1, 3, ..., 7.925, nan, 'S'],
       ...,
       [889, 0, 3, ..., 23.45, nan, 'S'],
       [890, 1, 1, ..., 30.0, 'C148', 'C'],
       [891, 0, 3, ..., 7.75, nan, 'Q']], dtype=object)
"""

获取某列数据

names = df['Name']   # 获取列名为Name的一列数据
names[:5]            #  names.values[:5]  # 返回前5行np格式数据
"""
0                              Braund, Mr. Owen Harris
1    Cumings, Mrs. John Bradley (Florence Briggs Th...
2                               Heikkinen, Miss. Laina
3         Futrelle, Mrs. Jacques Heath (Lily May Peel)
4                             Allen, Mr. William Henry
Name: Name, dtype: object
"""

设置df中某一列为索引

df = df.set_index('Name')  # 设置'Name'列为数据的索引
df.index                   # 查看新索引, 也可使用df.head()查看新的df数据
"""
Index(['Braund, Mr. Owen Harris',
       'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
       ...
       'Johnston, Miss. Catherine Helen "Carrie"', 'Behr, Mr. Karl Howell',
       'Dooley, Mr. Patrick'],
      dtype='object', name='Name', length=891)
"""

通过索引定位某个具体值

# 查看名字为"Braund, Mr. Owen Harris"的人存活情况
survived = df['Survived']            # 获取存活列(已经设置Name为索引列了)
survived['Braund, Mr. Owen Harris']  
# 0

二维数组数据块截取和赋值

  • 使用列名和行号获取
# 截取'Age'、'Fare'两列中第1,3,5,7,9行数据(行数从0开始)
df[['Age', 'Fare']][1:10:2]

注: Name列为索引列,不可截取,或已经有对应关系了。

  • 使用行号和列号获取(切片)
# 获取第0行数据
print(df.iloc[0])
# 获取第0行,前5列数据
print(df.iloc[0,0:5])
# 获取 前10中中偶数行,奇数列的数据
print(df.iloc[0:11:2,1::2])   # 说明0:11:2,从0开始到11,每次2个递增
  • 使用标签截取数据
# 获取名为'Braund, Mr. Owen Harris'行数据,Name已设置为索引
df.loc['Braund, Mr. Owen Harris']   
# 获取名为'Braund, Mr. Owen Harris'行中'Survied'属性
df.loc['Braund, Mr. Owen Harris', 'Survived'] 
# 也可以使用“:”连接切片开始和结束位置
df.loc['Braund, Mr. Owen Harris':'Allen, Mr. William Henry']  # 两个姓名索引之间的行
  • 对于获取的数据可以使用等号对其进行赋值修改。
  • 根据条件获取数据(使用bool类型)
# 获取所有年龄大于35的男性的前5条数据的平均年龄
res_df = df[df['Sex'] == 'male']
res_df[res_df['Age'] > 35][:5]['Age'].mean()

补充:pandas中对于df还有求平均值,求和等计算方法。

创建DataFrame数据

通过字典创建DataFrame数据

# key表示列名,value表示对应列的数据
data = {'A':[1,2,3],
       'B':['a','b','c']}
df_create = pd.DataFrame(data)

属性分离创建DataFrame数据

# 两行数据
data = [[i for i in range(5)], [i for i in range(5, 10)]]  
cols_name = [i for i in 'abcde']  # 两列数据对应的列名
index = ['A', 'B']  # 索引
df_create = pd.DataFrame(data, index=index, columns=cols_name)

设置显示数据最大行数

pd.get_option('display.max_rows')  # 查看当前能够显示数据最大行数
pd.set_option('display.max_rows', 10)  # 设置能够显示数据的最大行数

创建一个Series

col = [i for i in range(5)]
s = pd.Series(data=col)   # 使用默认索引
# s = pd.Series(data=col,index=[i for i in 'abcde']) # 自定义索引

补充:获取Series值和索引的操作与DataFrame相似,可使用loc、iloc方法,index方法。

对某列数据进行+、-、x、\等操作

# 对Fare的值进行计算
df['Fare'] = (df['Fare'] + 10 - 5)*2 / 5 

查看各列数据之间的协方差

df.cov()  # 返回各列之间的协方差df

查看各列数据之间的相关性

df.corr()   # 返回各列之间的相关系数df

合并两个DataFrame

  • 两个df形状相同,按照共同的索引合并,索引相同
# 创建两个DF
df_a = pd.DataFrame({'key':['K0','K1','K2','K3'], 'A':['A0','A1','A2','A3'], 'B':['BO','B1','B2','B3']})
df_b = pd.DataFrame({'key':['K0','K1','K2','K3'], 'C':['CO','C1','C2','C3'],'D':['DO','D1','D2','D3']})
res = pd.merge(df_a, df_b, on='key')
res
"""
key	A	B	C	D
0	K0	A0	BO	CO	DO
1	K1	A1	B1	C1	D1
2	K2	A2	B2	C2	D2
3	K3	A3	B3	C3	D3
"""
  • 按照共同的索引合并,索引不同,保留相同部分
df_a = pd.DataFrame({'key1':['K0','K1','K2','K3'], 
                     'key2':['K0','K1','K2','K3'],
                     'A':['A0','A1','A2','A3'],
                     'B':['BO','B1','B2','B3']})
df_b = pd.DataFrame({'key1':['K0','K1','K2','K3'],
                     'key2':['K0','K1','K2','K4'], 
                     'C':['C0','C1','C2','C3'], 
                     'D':[' DO','D1','D2','D3']})
res = pd.merge(df_a, df_b, on=['key1', 'key2'])
print(res)
# 如果不舍弃不同的部分,添加how='outer',不同的部分用NaN(not a number)填充
# how='left',以第一个df为准,舍弃第二个df,right类似
# indicator=True 参数表明显示当前列来自于哪个df
"""
key1	key2	A	B	C	D
0	K0	K0	A0	BO	C0	DO
1	K1	K1	A1	B1	C1	D1
2	K2	K2	A2	B2	C2	D2
"""
  • 纵向合并数据 pd.concat([df1,df2, ...], axis=0, ignore_index=True)重置索引,axis=1则是水平合并,与Numpy有很多相似的地方。
  • 使用join()方法合并操作与merge相类似,可参考官方文档。

列数据排序

import numpy as np
key = "abc"
data = pd.DataFrame({'type': [key[np.random.randint(3)] for i in range(10)], 
                     'data': [np.random.randint(20) for i in range(10)],
                    'others': [np.random.randint(50) for i in range(10)]})
print(data)
# 对type、data列进行排序,ascending指定对应列是否升序,inplace确定是否覆盖原来的值
data.sort_values(by=['type', 'data'], ascending=[True, False], inplace=True)
data

数据缺失值处理

pandas中缺失值通常使用NaN表示。

# 创建DataFrame,使用默认的索引已经列名
data = pd.DataFrame([range(3), [1, np.nan, 2], [1, 2, np.nan]])
data
"
0	1	2
0	0	1.0	2.0
1	1	NaN	2.0
2	1	2.0	NaN
"

通过isnull()函数判断缺失情况,返回形状和data相同的df,元素为True,False

查看数据缺失情况(是否有空值)

data.isnull().any()    # 默认查看的是各列,any(axis=1)查看各行的缺失情况
"
0    False
1     True
2     True
dtype: bool
"

填充指定值

data.fillna(0)  # 缺失值填充0

删除重复数据

data = pd.DataFrame({'col1':['a']*2 + ['b']*3, 'col2': [1, 1, 2, 2, 3]})
data.drop_duplicates()
# 参数 subset='col1' 留下col1列中不重复的数据

删除有Nan的行或列

data.drop_na()  # 参数axis默认为0,删除NaN行 axis=1删除列 参数how默认any,只要存在Nan就删除,all,只有整行或整列时再删除。

添加新的一列数据

data = pd.DataFrame({'col1':['a']*2 + ['b']*3, 'col2': [1, 1, 2, 2, 3]})
data.assign(rataion = data['col1'] + "-new")  # 新的列名为rataion 添加在最后一列

使用apply自定义函数

data = pd.DataFrame({'score':[np.random.randint(100) for i in range(10) ]})
def scoreLevel(series):
    if 0 <= series['score']  < 60:
        return "不及格"
    elif series['score'] < 70:
        return "及格"
    elif series['score'] < 80:
        return "中等"
    elif series['score'] < 90:
        return "良好"
    elif series['score'] <= 100:
        return "优秀"
    else:
        return "非法数字"
data['level'] = data.apply(scoreLevel, axis=1) # 处理对象为行,axis默认为0

这也是新增一列数据的方法。

# 统计泰坦尼克号数据各列中的空值个数
def nan_count(columns):
    columns_null = pd.isnull(columns) # 返回列,对应True、False
    null = columns[columns_null]      # 筛选出当前列中为空的数据
    return len(null)                  # 返回当前列为空数据的个数

df.apply(nan_count)  # 会遍历数据中所有的列(包括索引)

根据起始时间以及时间间隔创建Series

# 开始时间为 2020-03-14 08:00:00,每八小时采集一次数据
ser = pd.Series(pd.date_range(start='2020-03-14', periods=10, freq='8H'))

翻转数据

df.T     # 等价于numpy中的矩阵转置 也可使用np.transpose(df)

根据条件修改值

df[df['Age'] > 80] = 80  # 将年龄大于80的设置为80

将数据导出为pickle格式数据

df.to_pickle("tantic.pickle")

读取pickle格式数据

pd.read_pickle('tantic.pickle')
### 回答1: 人工智能基础教程Python PDF是一本通过Python编程语言来学习人工智能技术的书籍,被广泛应用于机器学习、自然语言处理、语音识别等领域,为初学者提供了深入浅出的讲解。本书总结Python编程基础的知识和技巧,通过实例和实践来巩固读者对机器学习、深度学习和自然语言处理的认识和技能,并具有一定的实用性和可迁移性。书中详细介绍了Python编程的基础知识和语法,以及常用的人工智能技术和算法,如回归分析、分类算法、神经网络以及深度学习等。本书的优点在于,它结合了理论和实践的内容,不仅有详细的介绍和说明,还融入了大量实战案例和代码,可以极大地提高学习的效率和质量。同时,针对不同的读者需求,本书还提供了不同难度的学习方案和进阶实践,以便读者能够根据自己的学习进度和兴趣选择适合自己的内容。总之,人工智能基础教程Python PDF是一本很好的入门教材,适合各个领域初学人工智能的读者。 ### 回答2: 人工智能基础教程Python PDF是一本介绍人工智能基础知识和Python编程语言的教材。Python是很好的人工智能编程语言,因为它易于学习,具有简洁的语法和强大的功能。这本教材主要涵盖了Python编程语言的基础知识,包括数据结构、函数、循环和条件语句等。它也包含了用于人工智能的重要库,如NumPy、Pandas、Matplotlib和Scikit-Learn。这些库可以帮助您在Python中处理和分析数据、创建图表和可视化、以及进行机器学习和深度学习。 这本教材还包含了一些领域特定的案例研究,如图像处理、文本处理和语音识别。这些案例研究可以帮助您了解如何将Python编程语言应用于实际的人工智能应用中。此外,本书也介绍了一些有用的工具和技术,如Jupyter笔记本和Python包管理器,以帮助您更有效地编写和管理Python程序。 总的来说,人工智能基础教程Python PDF是一本很好的人工智能入门教材,它深入浅出地介绍了Python编程语言和一些重要的库和工具,以及实际应用案例。这本教材适合那些想要了解人工智能和Python编程语言的初学者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智绘山河

你的鼓励可能解决你下一个问题

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

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

打赏作者

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

抵扣说明:

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

余额充值