> Photo by Pascal Müller on Unsplash
本月初,我和爱德华·钱(Edward Qian)和我开始为有抱负的数据科学家设计一套全面的课程,可以在我们的网站www.dscrashcourse.com上找到这些课程。
我将把稍作修改的课程交叉发布到中级课程,以使更多的读者可以使用。 如果您发现这些文章有帮助,请访问该站点以获取更多课程和练习问题!
pandas是一个Python库,可以轻松读取,导出和使用关系数据。 本课将扩展其功能和用法。 我们通常将熊猫作为pd导入,以使用缩写形式引用该库。 下面共享的所有代码都是使用pandas == 0.24.2的Python 3编写的。
Pandas系列根据官方文档,Series是带有轴标签的一维ndarray。 ndarray是在numpy库中找到的一种特殊数据类型,它定义了固定大小的元素数组。 简单来说,"系列"是表或电子表格中具有相同数据类型的列。 每个系列都有一个用于指示轴标签的索引。
我们可以使用pd.Series(['some','array','object'])创建一个Series
Index序列我们可以使用轴标签或位置标签来查找系列值。 如果未指定,则Series轴标签(也称为Series索引)将默认为整数。 我们也可以将索引设置为字符串。
sample_series = pd.Series(['some', 'array', 'object'], index=list('abc'))
# positional indexing: this returns the first value, which is 'some'
sample_series[0]
# label indexing: this also returns the first value 'some'
sample_series['a']
这就是sample_series的样子。
我们可以对系列进行切片以获取一系列值。 使用轴标签时,切片行为有所不同-与通常的Python切片相反,起点和终点都包括在内!
# positional slicing: this returns the first two values
sample_series[:2]
# label slicing: this also returns the first two values
sample_series[:'b']
Pandas数据框
DataFrames用于定义二维数据。 使用索引标记行,使用列标题标记列。 每列都可以解释为系列。 我们可以使用pd.DataFrame({'column 1':[1,1],'column 2':[2,2]})创建一个DataFrame。
另外,我们也可以将表格数据读取到DataFrames中。
# Read in a CSV file
csv_dataframe = pd.read_csv('my_csv_file.csv')
# Read in an Excel file
xls_dataframe = pd.read_excel('my_xls_file.xls')
索引数据帧
我们可以使用方括号对DataFrame列进行索引。 让我们以我们创建的非常简单的DataFrame为例。
sample_dataframe = pd.DataFrame({'column 1': [1, 1], 'column 2': [2, 2]})
# get the column 'column 1'
sample_dataframe['column 1']
对于更复杂的索引,我们可以使用.iloc或.loc。
· loc是基于标签的索引方法,它需要行和列的名称
· iloc是基于位置的索引方法,该方法需要值的位置
因为我们没有为行指定轴标签,所以它们采用了默认的整数值。 因此,此DataFrame的位置标签和轴标签相同。
我们可以使用以下任一方法检索第一行:
sample_dataframe.iloc[0, :]
sample_dataframe.loc[0, :]
用Pandas探索合成数据集
让我们创建另一个DataFrame来说明一些功能。 我们可以假装此数据取自分发教育材料的公司。
data = pd.DataFrame({'customer_id': [1,2,3,4,5,6,7,8],
'age': [29,43,22,82,41,33,63,57],
'email_linked': [True,True,False,True,False,False,True,True],
'occupation': ['teacher','highschool teacher','student','retired',
'tutor','unemployed','entrepreneur','professor']})
对于较大的DataFrame,我们可以使用.head(n)查看前n行。 要查看最后几行,我们可以使用.tail(n)执行类似的操作。 对于我们的小型数据集而言,这都不是必需的,但我们仍然可以使用data.head(3)进行演示。
过滤和索引数据框假设我们要运行一个电子邮件活动。 我们首先提取相关的列来开展我们的运动。
# use double brackets to index multiple columns, single brackets for one column
email_data = data[['customer_id', 'email_linked']]
并非所有客户都有链接的电子邮件,因此我们绝对希望排除那些没有链接的电子邮件。
# the condition goes inside the square brackets
email_data = email_data[email_data['email_linked']]
应用逐列函数
让我们编写一个非常简单的函数来确定客户是否为教育工作者。 这就是我们定义教育者的方式。
def is_educator(occupation):
return 'teacher' in occupation.lower() or occupation.lower() in ['tutor', 'professor', 'lecturer']
我们可以将此功能应用于职业列以创建一个新列。
data['is_educator'] = data['occupation'].apply(is_educator)
我们还可以转换DataFrame每列中的所有行。 这就要求我们设置axis = 0(这也是默认设置)。 我们可以编写逐列函数,以删除任何包含缺少值的列。 这仅用于演示-有更好的方法来处理缺失的值(请参阅Pandas官方文档)。
def remove_missing_columns(col):
if col.isnull().values.any():
return coldata.apply(remove_missing_columns, axis=0)
应用逐行函数
我们还可以应用函数来转换行中的每一列。 这要求我们将axis = 1。
def is_educator_above_50(row):
return row['age'] > 50 and is_educator(row['occupation'])
data['is_educator_above_50'] = data.apply(is_educator_above_50, axis=1)
Groupby操作对于分析Pandas对象和从大量数据中设计新功能很有用。 所有groupby操作可以分为以下步骤:
· 将对象分成组
· 将功能应用于每个组
· 合并结果
通常,根据某些条件对对象进行拆分,然后为每个组计算摘要统计量,然后将其合并为更大的对象。 我们可以使用groupby运算来计算每个职业的平均年龄。
· 按职业拆分DataFrame
· 对每个职业应用均值函数
· 将平均年龄结合到自己的对象中
该操作的代码非常简单:data.groupby(by=['occupation']).mean()['age']
" by"参数指示如何确定组," mean()"是关注的统计量,按年龄编制索引可获取年龄的组统计量。 输出是一系列,其中职业是轴标签。
我们可以使用多个参数来划分组,例如,职业的组合以及是否链接了他们的电子邮件:data.groupby(by=['email_linked', 'occupation']).mean()['age']
除了平均值以外,我们还可以将其他内置函数应用于每个组:最小,最大,计数,总和等。 我们还可以使用agg()来应用任何自定义函数。 聚合方法对于返回多个摘要统计信息也很有用。
例如,data.groupby(by=['occupation']).agg(['mean', 'sum'])['age']将返回平均年龄以及每个组的年龄总和。
DataFrame属性这些属性可帮助我们探索并熟悉新的DataFrame。
· data.columns返回所有列的列表
· data.shape以(行数,列数)的形式返回尺寸
· data.dtypes返回每一列的数据类型
· data.index返回索引值的范围
以下是一些其他有用的阅读材料:· 有关语法,用法和更多示例,请参阅官方熊猫文档。
· 图书:用于数据分析的Python:使用Pandas,NumPy和IPython处理数据
感谢您的阅读!如果您喜欢这篇文章,则可能需要查看我有关数据科学,数学和编程的其他文章。 在" Medium"上关注我以获取最新更新!
(本文翻译自Mandy Gu的文章《In-Depth Pandas Tutorial》,参考:https://towardsdatascience.com/in-depth-pandas-tutorial-5d896483ba8a)
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved