知乎文章
Pandas(这是“面板数据”的缩写)是您开始学习Python时要掌握的最重要的软件包之一。
该软件包以称为pandas DataFrame的非常有用的数据结构而闻名。Pandas还允许Python开发人员轻松地在Python脚本中处理表格数据(例如电子表格)。
本教程将教您熊猫的基本知识,您现在可以使用它们来构建数据驱动的Python应用程序。
目录
您可以使用以下目录跳至本熊猫教程的特定部分:
- 熊猫介绍
- 熊猫系列
- 熊猫数据框
- 如何处理Pandas Dat aFrame中的丢失数据
- 熊猫
groupby
法 - 什么是熊猫
groupby
功能? - 熊猫
concat
法 - 熊猫
merge
法 - 熊猫
join
法 - 熊猫的其他常见行动
- 熊猫的本地数据输入和输出(I / O)
- 熊猫中的远程数据输入和输出(I / O)
- 最后的想法和特别优惠
熊猫介绍
Pandas是建立在NumPy之上的广泛使用的Python库。本课程的其余大部分内容将致力于学习熊猫及其在金融界的用途。
什么是熊猫?
Pandas是由Wes McKinney创建的Python库,他构建了pandas来帮助使用Python中的数据集工作,从而在他的工作地点从事金融工作。
根据图书馆的网站,pandas是**“一种快速,强大,灵活且易于使用的开源数据分析和处理工具,建立在Python编程语言之上。”**
熊猫代表“面板数据”。请注意,尽管熊猫被视为在句子开头大写首字母的最佳做法,但通常将其样式化为全小写单词。
Pandas是一个开放源代码库,这意味着任何人都可以查看其源代码并使用请求请求提出建议。如果您对此感到好奇,请访问GitHub上的pandas源代码存储库
熊猫的主要好处
Pandas旨在处理二维数据(类似于Excel电子表格)。就像NumPy库具有称为的内置数据结构(array
具有特殊属性和方法)一样,pandas库也具有称为a的内置二维数据结构DataFrame
。
我们将对熊猫学到什么
正如我们在本课程中前面提到的,与使用NumPy相比,高级Python从业人员与熊猫工作所花费的时间要多得多。
在接下来的几节中,我们将介绍有关pandas库的以下信息:
- 熊猫系列
- 熊猫数据框
- 如何处理熊猫中的丢失数据
- 如何在熊猫中合并数据框
- 如何在熊猫中加入数据框
- 如何串联熊猫中的数据框
- 熊猫的共同行动
- 熊猫的数据输入和输出
- 如何将Pandas DataFrames保存为Excel文件供外部用户使用
熊猫系列
在本节中,我们将探讨pandas系列,这是pandas库中用于Python编程的核心组件。
什么是熊猫系列?
系列是pandas Python库中可用的一种特殊类型的数据结构。Pandas Series与NumPy数组相似,除了我们可以给它们指定一个命名索引或日期时间索引,而不仅仅是数字索引。
您需要使用Pandas系列的进口商品
要使用pandas Series,您需要同时导入NumPy和pandas,如下所示:
import numpy as np
import pandas as pd
对于本节的其余部分,我将假定在运行任何代码块之前都已执行了所有这些导入。
如何创建熊猫系列
创建熊猫系列有多种方法。我们将在本节中探索所有这些。
首先,让我们创建一些入门变量-具体来说,我们将创建两个列表,一个NumPy数组和一个字典。
labels = ['a', 'b', 'c']
my_list = [10, 20, 30]
arr = np.array([10, 20, 30])
d = {'a':10, 'b':20, 'c':30}
创建pandas系列的最简单方法是将普通的Python列表传递给该pd.Series()
方法。我们使用以下my_list
变量进行此操作:
pd.Series(my_list)
如果在Jupyter Notebook中运行此命令,您会注意到输出与普通Python列表的输出完全不同:
0 10
1 20
2 30
dtype: int64
上面显示的输出清楚地设计为显示为两列。第二列是的数据my_list
。第一栏是什么?
与NumPy数组相比,使用Pandas Series的主要优势之一是它们允许标记。您可能已经猜到了,第一列是标签列。
我们可以使用如下index
参数为pandas系列添加标签:
pd.Series(my_list, index=labels)
#Remember - we created the 'labels' list earlier in this section
此代码的输出如下:
a 10
b 20
c 30
dtype: int64
您为什么要在熊猫系列中使用标签?主要优点是它允许您使用其标签而不是其数字索引来引用该系列的元素。需要明确的是,一旦标签已被应用到熊猫系列,你可以使用任何的数字索引或它的标签。
下面是一个示例。
Series = pd.Series(my_list, index=labels)
Series[0]
#Returns 10
Series['a']
#Also returns 10
您可能已经注意到,参考使用一系列其标签的元素的能力,类似于我们如何能够引用value
一个的key
- value
对在字典中。由于它们在功能上的相似之处,您还可以传入字典来创建pandas系列。我们将使用d={'a': 10, 'b': 20, 'c': 30}
我们先前创建的作为示例:
pd.Series(d)
该代码的输出为:
a 10
b 20
c 30
dtype: int64
尚不清楚为什么我们要探索两个如此相似的新数据结构(NumPy数组和pandas系列)。在本节的下一部分中,我们将探讨pandas系列相对于NumPy数组的主要优势。
熊猫系列相对于NumPy阵列的主要优势
尽管我们当时还没有遇到过,但是NumPy数组受到一个特征的高度限制:NumPy数组的每个元素都必须是相同类型的数据结构。换句话说,NumPy数组元素必须全部为字符串,或者全部为整数,或者全部为布尔值-您明白了。
熊猫系列不受此限制。实际上,熊猫系列是高度灵活的。
例如,您可以将Python的三个内置函数传递给pandas Series,而不会出现错误:
pd.Series([sum, print, len])
这是该代码的输出:
0 <built-in function sum>
1 <built-in function print>
2 <built-in function len>
dtype: object
需要明确的是,上面的示例非常不切实际,不是我们在实践中可以执行的示例。但是,它是熊猫系列数据结构灵活性的一个很好的例子。
熊猫数据框
NumPy允许开发人员使用一维NumPy数组(有时称为向量)和二维NumPy数组(有时称为矩阵)。在上一节中,我们研究了熊猫系列,它们与一维NumPy数组相似。
在本节中,我们将深入研究pandas DataFrames,它类似于二维NumPy数组-但功能更多。DataFrames是pandas库中最重要的数据结构,因此在本节中请密切注意。
什么是熊猫数据框?
pandas DataFrame是一个二维数据结构,它的行和列都有标签。对于熟悉Microsoft Excel,Google表格或其他电子表格软件的用户,DataFrames非常相似。
这是在Jupyter Notebook中显示的熊猫DataFrame的示例。
现在,我们将逐步完成重新创建此DataFrame的过程。
首先,您需要同时导入NumPy和pandas库。我们之前已经做过,但是如果您不确定,这是如何执行此操作的另一个示例:
import numpy as np
import pandas as pd
我们还需要为行和列名称创建列表。我们可以使用原始的Python列表来做到这一点:
rows = ['X','Y','Z']
cols = ['A', 'B', 'C', 'D', 'E']
接下来,我们将需要创建一个NumPy数组,该数组保存DataFrame单元中包含的数据。我np.random.randn
为此使用了NumPy的方法。我还将该方法包装在np.round
方法中(带有的第二个参数2
),该方法将每个数据点四舍五入到小数点后两位,并使数据结构更易于阅读。
这是生成数据的最终函数。
data = np.round(np.random.randn(3,5),2)
完成此操作后,您可以将所有组成变量包装在pd.DataFrame
方法中,以创建第一个DataFrame!
pd.DataFrame(data, rows, cols)
这里有很多要解压的内容,因此让我们更详细地讨论这个示例。
首先,没有必要在DataFrame本身之外创建每个变量。您可以像这样在一行中创建此DataFrame:
pd.DataFrame(np.round(np.random.randn(3,5),2), ['X','Y','Z'], ['A', 'B', 'C', 'D', 'E'])
话虽如此,分别声明每个变量使代码更易于阅读。
其次,您可能想知道是否有必要在DataFrame
方法之前将行放入列中。确实是必要的。如果您尝试运行pd.DataFrame(data, cols, rows)
,Jupyter Notebook将生成以下错误消息:
ValueError: Shape of passed values is (3, 5), indices imply (5, 3)
接下来,我们将探讨pandas系列和pandas DataFrames之间的关系。
熊猫系列与Pandas DataFrame之间的关系
让我们再看一下刚刚创建的pandas DataFrame:
如果您必须口头描述一个熊猫系列,那么这样做的一种方法可能是“ 一组包含数据的带标签的列,每个列共享相同的行索引集。”
有趣的是,这些专栏实际上都是熊猫系列!因此,我们可以修改pandas DataFrame的定义以使其符合其正式定义:
“ 一组具有相同索引的熊猫系列。”
熊猫数据框架中的索引和分配
实际上,我们可以使用方括号从pandas DataFrame调用特定的Series,就像我们从列表中调用元素一样。以下是一些示例:
df = pd.DataFrame(data, rows, cols)
df['A']
"""
Returns:
X -0.66
Y -0.08
Z 0.64
Name: A, dtype: float64
"""
df['E']
"""
Returns:
X -1.46
Y 1.71
Z -0.20
Name: E, dtype: float64
"""
如果要从pandas DataFrame中选择多个列怎么办?您可以直接在方括号中输入列的列表(例如df[['A', 'E']]
-),也可以通过在方括号之外声明变量,如下所示:
columnsIWant = ['A', 'E']
df[columnsIWant]
#Returns the DataFrame, but only with columns A and E
您还可以使用链式方括号选择特定行的特定元素。例如,如果您希望包含在索引X的A行中的元素(这是DataFrame左上方单元格中的元素),则可以使用进行访问df['A']['X']
。
下面是其他一些示例。
df['B']['Z']
#Returns 1.34
df['D']['Y']
#Returns -0.64
如何在Pandas DataFrame中创建和删除列
您可以在熊猫数据框架中创建新列,方法是将其指定为已存在,然后为其分配新的熊猫系列。
例如,在下面的代码块中,我们创建一个名为“ A + B”的新列,该列是A和B列的总和:
df['A + B'] = df['A'] + df['B']
df
#The last line prints out the new DataFrame
这是该代码块的输出:
要从pandas DataFrame中删除此列,我们需要使用pd.DataFrame.drop
方法。
请注意,此方法默认为删除行,而不是列。要切换方法设置以对列进行操作,我们必须在axis=1
参数中传递它。
df.drop('A + B', axis = 1)
需要特别注意的是,该drop
方法实际上并没有修改DataFrame本身。为了证明这一点,请df
再次打印出变量,并注意它仍然具有以下列A + B
:
df
之所以说drop
(和许多其他数据帧的方法!)默认不修改数据结构是为了防止意外删除数据。
有两种方法可以使熊猫自动覆盖当前的DataFrame。
首先是通过传递参数inplace=True
,如下所示:
df.drop('A + B', axis=1, inplace=True)
第二种方法是使用赋值运算符手动覆盖现有变量,如下所示:
df = df.drop('A + B', axis=1)
这两个选项均有效,但我发现自己更经常使用第二个选项,因为它更容易记住。
该drop
方法还可以用于删除行。例如,我们可以Z
如下删除该行:
df.drop('Z')
如何从Pandas DataFrame中选择一行
我们已经看到我们可以使用方括号访问pandas DataFrame的特定列。现在,我们将看到如何访问pandas DataFrame的特定行,其相似的目标是从较大的数据结构中生成pandas系列。
可以使用loc
属性和方括号通过其行标签访问DataFrame行。下面是一个示例。
df.loc['X']
这是该代码的输出:
A -0.66
B -1.43
C -0.88
D 1.60
E -1.46
Name: X, dtype: float64
可以使用iloc
属性和方括号通过其数字索引访问DataFrame行。下面是一个示例。
df.iloc[0]
如您所料,此代码与上一个示例具有相同的输出:
A -0.66
B -1.43
C -0.88
D 1.60
E -1.46
Name: X, dtype: float64
如何确定Pandas DataFrame中的行数和列数
在许多情况下,您需要了解熊猫DataFrame的形状。按形状,我指的是数据结构中的列数和行数。
Pandas具有一个内置属性shape
,该属性使我们可以轻松访问此属性:
df.shape
#Returns (3, 5)
切片熊猫数据框
我们已经看到了如何从pandas DataFrame中选择行,列和元素。在本节中,我们将探讨如何选择DataFrame的子集。具体来说,我们选择从列元素A
和B
与行X
和Y
。
实际上,我们可以逐步解决此问题。首先,我们选择列A
和B
:
df[['A', 'B']]
然后,让我们选择行X
和Y
:
df[['A', 'B']].loc[['X', 'Y']]
我们完成了!
使用Pandas DataFrame进行条件选择
如果您回想起有关NumPy数组的讨论,则可以使用条件运算符选择数组的某些元素。例如,如果我们调用了一个NumPy数组,arr
而我们只希望该数组的值大于4,则可以使用command arr[arr > 4]
。
Pandas DataFrames遵循类似的语法。例如,如果我们想知道我们的DataFrame的值大于0.5的位置,我们可以键入df > 0.5
以获取以下输出:
我们还可以生成一个新的pandas DataFrame,其中包含语句为时的常规值True
,以及NaN
-表示非数字-语句为false时的值。为此,我们使用方括号将语句传递到DataFrame中,如下所示:
df[df > 0.5]
这是该代码的输出:
您还可以使用条件选择来返回DataFrame的子集,其中指定列中满足特定条件。
更具体地说,假设您想要DataFrame的子集,其中column的值C
小于1。这仅适用于row X
。
您可以像下面这样获得与该语句关联的布尔值数组:
df['C'] < 1
这是输出:
X True
Y False
Z False
Name: C, dtype: bool
您还可以通过键入获得与该条件选择命令相关的DataFrame的实际值,该命令df[df['C'] < 1]
仅输出DataFrame的第一行(因为这是对column语句为true的唯一行C
:
您还可以在使用条件选择时将多个条件链接在一起。我们使用pandas的&
运算符执行此操作。您不能使用Python的常规and
运算符,因为在这种情况下,我们不比较两个布尔值。相反,我们正在比较两个包含布尔值的熊猫系列,这就是为什么使用该&
字符的原因。
由于多个条件选择的一个例子,你可以返回数据帧子集满足df['C'] > 0
,并df['A']> 0
用下面的代码:
df[(df['C'] > 0) & (df['A']> 0)]
如何修改Pandas DataFrame的索引
您可以通过多种方式修改熊猫DataFrame的索引。
最基本的是将索引重置为其默认数值。我们使用以下reset_index
方法执行此操作:
df.reset_index()
请注意,这会在DataFrame中创建一个新列index
,其中包含先前的索引标签:
请注意,与我们探索的其他DataFrame操作一样,reset_index
除非您(1)强迫它使用=
赋值运算符或(2)指定,否则不要修改原始DataFrame inplace=True
。
您还可以使用set_index
方法将现有列设置为DataFrame的索引。我们可以A
使用以下代码将column设置为DataFrame的索引:
df.set_index('A')
现在的值A
位于DataFrame的索引中:
这里有三件事值得注意:
set_index
除非您(1)强迫它使用=
赋值运算符或(2)指定,否则不会修改原始DataFrameinplace=True
。- 除非您
reset_index
先运行,否则set_index
使用inplace=True
或强制=
赋值运算符执行操作将永久覆盖当前索引值。 - 如果您想将索引重命名为当前列中不包含的标签,可以通过(1)使用这些值创建一个NumPy数组,(2)将这些值添加为pandas DataFrame的新行,然后将其重命名。 (3)运行
set_index
操作。
如何重命名Pandas DataFrame中的列
我们将讨论的最后一个DataFrame操作是如何重命名其列。
列是pandas DataFrame的属性,这意味着我们可以调用它们并使用简单的点运算符对其进行修改。例如:
df.columns
#Returns Index(['A', 'B', 'C', 'D', 'E'], dtype='object'
赋值运算符是修改此属性的最佳方法:
df.columns = [1, 2, 3, 4, 5]
df
如何处理Pandas DataFrames中的丢失数据
在理想的世界中,我们将始终使用完善的数据集。但是,实际情况并非如此。在处理定量数据时,有很多情况需要删除或修改丢失的数据。在本节中,我们将探讨处理熊猫中缺失数据的策略。
本节中将使用的DataFrame
在本节中,我们将使用该np.nan
属性来生成NaN
值。
Np.nan
#Returns nan
在本节中,我们将使用以下DataFrame:
df = pd.DataFrame(np.array([[1, 5, 1],[2, np.nan, 2],[np.nan, np.nan, 3]]))
df.columns = ['A', 'B', 'C']
df
熊猫dropna
法
熊猫有一个称为的内置方法dropna
。当对DataFrame应用时,该dropna
方法将删除任何包含NaN值的行。
让我们将该dropna
方法应用于我们的df
DataFrame作为示例:
df.dropna()
请注意,与我们探索的其他DataFrame操作一样,dropna
除非您(1)强迫它使用=
赋值运算符或(2)指定,否则不要修改原始DataFrame inplace=True
。
我们还可以通过将axis=1
参数传递给dropna
方法来删除任何缺少值的列,如下所示:
df.dropna(axis=1)
熊猫fillna
法
在许多情况下,您将希望替换熊猫DataFrame中的缺失值,而不是完全删除它。该fillna
方法就是为此而设计的。
举例来说,让我们在DataFrame中使用填充所有缺失的值🔥
:
df.fillna('🔥')
显然,基本上没有一种情况需要用表情符号替换丢失的数据。这只是一个有趣的例子。
相反,更常见的是,我们将缺失值替换为:
- 整个DataFrame的平均值
- DataFrame的该行的平均值
我们将在下面进行演示。
要使用整个DataFrame的平均值填充缺失值,请使用以下代码:
df.fillna(df.mean())
要用该列中的平均值填充特定列中的缺失值,请使用以下代码(这适用于column A
):
df['A'].fillna(df['A'].mean())
熊猫groupby
法
在本节中,我们将讨论如何使用pandas groupby功能。
什么是熊猫groupby
功能?
Pandas具有内置groupby
功能,可让您根据列将行分组在一起并对其执行汇总功能。例如,您可以计算1
column中值为的所有行的总和ID
。
对于熟悉SQL查询数据库语言的人来说,pandas groupby
方法与SQL groupby语句非常相似。
groupby
使用示例最容易理解pandas 方法。我们将使用以下DataFrame:
df = pd.DataFrame([ ['Google', 'Sam', 200],
['Google', 'Charlie', 120],
['Salesforce','Ralph', 125],
['Salesforce','Emily', 250],
['Adobe','Rosalynn', 150],
['Adobe','Chelsea', 500]])
df.columns = ['Organization', 'Salesperson Name', 'Sales']
df
此DataFrame包含三个独立组织的销售信息:Google,Salesforce和Adobe。我们将使用该groupby
方法获取每个特定组织的摘要销售数据。
首先,我们需要创建一个groupby
对象。这是一个数据结构,告诉Python您要将DataFrame分组的依据。在我们的例子中,它是Organization
列,因此我们创建一个groupby
像这样的对象:
df.groupby('Organization')
如果看到如下所示的输出,您将知道您已成功创建该对象:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x113f4ecd0>
一旦groupby
对象被创建,你可以调用该对象上的操作来创建的概要信息的数据帧Organization
组。以下是一些示例:
df.groupby('Organization').mean()
#The mean (or average) of the sales column
df.groupby('Organization').sum()
#The sum of the sales column
df.groupby('Organization').std()
#The standard deviation of the sales column
请注意,由于上述所有操作都是数值运算,因此它们将自动忽略该Salesperson Name
列,因为该列仅包含字符串。
以下是一些其他与pandas groupby
方法配合使用的聚合函数:
df.groupby('Organization').count()
#Counts the number of observations
df.groupby('Organization').max()
#Returns the maximum value
df.groupby('Organization').min()
#Returns the minimum value
使用groupby
与describe
方法
使用pandas DataFrames时,一个非常有用的工具是describe
方法,它为groupby
函数正在使用的每个类别返回有用的信息。
最好通过一个例子来学习。我将下面的groupby
和describe
方法结合在一起:
df.groupby('Organization').describe()
输出如下所示:
熊猫concat
法
在本节中,我们将学习如何连接pandas DataFrames。这将是一个简短的部分,但这仍然是一个重要的概念。让我们开始吧!
我们将在本节中使用的数据框
为了演示如何合并熊猫数据框,我将使用以下3个示例数据框:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
如何串联熊猫数据框
上过我的Python入门课程的任何人都会记住,字符串串联意味着将一个字符串添加到另一个字符串的末尾。字符串连接的示例如下。
str1 = "Hello "
str2 = "World!"
str1 + str2
#Returns 'Hello World!'
DataFrame串联非常相似。这意味着将一个DataFrame添加到另一个DataFrame的末尾。
为了使我们执行字符串连接,我们应该有两个具有相同列的DataFrame。下面是一个示例:
pd.concat([df1, df2, df3])
默认情况下,pandas将沿着串联axis=0
,这意味着它会添加行而不是列。
如果要添加行,只需将axis=0
新变量作为concat
函数传入。
pd.concat([df1,df2,df3],axis=1)
在我们的例子中,这将创建一个非常丑陋的DataFrame,其中包含许多缺失值:
熊猫merge
法
在本节中,我们将学习如何合并pandas DataFrames。
我们将在本节中使用的数据框架
在本节中,我们将使用以下两个熊猫DataFrame:
import pandas as pd
leftDataFrame = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
rightDataFrame = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
列A
,B
,C
,并D
在他们的真实数据,而列key
有一个键,既DataFrames普遍。对于merge
两个DataFrame,意味着将它们沿它们共同的一列连接。
如何合并熊猫数据框
您可以使用这些merge
列沿公共列合并两个pandas DataFrame 。对于熟悉SQL编程语言的任何人,这都与在SQL中执行非常相似inner join
。
如果您不熟悉SQL,请不要担心,因为merge
语法实际上非常简单。看起来像这样:
pd.merge(leftDataFrame, rightDataFrame, how='inner', on='key')
让我们分解一下传递给merge
方法的四个参数:
leftDataFrame
:这是我们想在左侧合并的DataFrame。rightDataFrame
:这是我们要在右侧合并的DataFrame。how=inner
:这是操作正在执行的合并类型。合并有多种类型,但是在本课程中,我们将仅介绍内部合并。on='key'
:这是您要对其执行合并的列。由于key
是两个DataFrame之间唯一的公共列,因此它是我们可以用来执行合并的唯一选项。
熊猫join
法
在本节中,您将学习如何加入pandas DataFrames。
我们将在本节中使用的数据框
在本节中,我们将使用以下两个DataFrame:
leftDataFrame = pd.DataFrame({ 'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']},
index =['K0', 'K1', 'K2', 'K3'])
rightDataFrame = pd.DataFrame({ 'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index = ['K0', 'K1', 'K2', 'K3'])
如果这些看起来很熟悉,那是因为它们!这些与我们学习如何合并熊猫数据框时使用的数据框几乎相同。一个关键的区别是key
它现在不是DataFrame的索引,而不是它自己的列。您可以将这些DataFrame视为执行后的最后一部分.set_index(key)
。
如何加入熊猫数据框
加入pandas DataFrames与合并pandas DataFrames非常相似,不同之处在于要合并的键位于索引中而不是包含在列中。
要连接这两个DataFrame,我们可以使用以下代码:
leftDataFrame.join(rightDataFrame)
熊猫的其他常见行动
本节将探讨pandas Python库中的常见操作。本节的目的是探讨迄今为止我们尚未讨论的任何重要熊猫活动。
我们将在本节中使用的DataFrame
我将在本节中使用以下DataFrame:
df = pd.DataFrame({'col1':['A','B','C','D'],
'col2':[2,7,3,7],
'col3':['fgh','rty','asd','qwe']})
如何在熊猫系列中找到独特的价值
熊猫有一种极好的方法unique
,可用于在熊猫系列中查找唯一值。请注意,此方法仅适用于Series,不适用于DataFrames。如果尝试将此方法应用于DataFrame,则会遇到错误:
df.unique()
#Returns AttributeError: 'DataFrame' object has no attribute 'unique'
但是,由于pandas DataFrame的列都是Series,因此我们可以将unique
方法应用于特定列,如下所示:
df['col2'].unique()
#Returns array([2, 7, 3])
熊猫还有一个单独的nunique
方法,该方法计算系列中唯一值的数量,然后将该值作为整数返回。例如:
df['col2'].nunique()
#Returns 3
有趣的是,该nunique
方法与之完全相同,len(unique())
但是它是一个足够普遍的操作,熊猫社区决定为此用例创建一个特定的方法。
如何计算熊猫系列中每个值的出现率
熊猫具有一个称为的功能counts_value
,可让您轻松计算每次观察发生的时间。下面是一个示例:
df['col2'].value_counts()
"""
Returns:
7 2
2 1
3 1
Name: col2, dtype: int64
"""
如何使用熊猫apply
方法
该apply
方法是pandas库中可用的最强大的方法之一。它允许您将自定义函数应用于熊猫系列的每个元素。
例如,假设我们有以下函数exponentify
,它接受一个整数并将其提升为幂:
def exponentify(x):
return x**x
该apply
方法使您可以轻松地将exponentify
函数应用于Series的每个元素:
df['col2'].apply(exponentify)
"""
Returns:
0 4
1 823543
2 27
3 823543
Name: col2, dtype: int64
"""
该apply
方法也可以与类似的内置函数一起使用len
(尽管与自定义函数一起使用时肯定更强大)。len
结合使用的功能的示例apply
如下:
df['col3'].apply(len)
"""
Returns
0 3
1 3
2 3
3 3
Name: col3, dtype: int64
"""
如何对熊猫数据框进行排序
您可以使用sort_values
方法按特定列的值过滤pandas DataFrame 。例如,如果要col2
在DataFrame中进行排序df
,请运行以下命令:
df.sort_values('col2')
该命令的输出如下:
此输出有两点需要注意:
- 如您所见,每一行都保留其索引,这意味着索引现在已乱序。
- 与其他DataFrame方法一样,除非您强迫它使用
=
赋值运算符或通过传入,否则它实际上不会修改原始DataFrameinplace = True
。
熊猫的本地数据输入和输出(I / O)
在本节中,我们将开始探索pandas Python库的数据输入和输出。
本节中我们将使用的文件
在本部分中,我们将使用包含Facebook(FB),Amazon(AMZN),Google(GOOG)和Microsoft(MSFT)股票价格的不同文件。要下载这些文件,请在此处下载本课程的整个GitHub存储库。stock_prices
在存储库的文件夹中可以找到本节中使用的文件。
在本节中,您需要将这些文件保存在与Jupyter Notebook相同的目录中。最简单的方法是下载GitHub存储库,然后在以下位置打开Jupyter Notebook:stock_prices
在存储库文件夹中。
如何汇入 .csv
使用熊猫文件
我们可以.csv
使用以下read_csv
方法将文件导入pandas DataFrame :
import pandas as pd
pd.read_csv('stock_prices.csv')
正如您将看到的,这将创建(并显示)一个新的pandas DataFrame,其中包含.csv
文件中的数据。
您还可以使用常规=
赋值运算符将此新DataFrame分配给变量,以供以后引用:
new_data_frame = pd.read_csv('stock_prices.csv')
有一些 read
熊猫编程库中包含方法。如果您尝试从外部文档导入数据,则熊猫可能为此具有内置方法。
read
以下是几种不同方法的示例:
pd.read_json()
pd.read_html()
pd.read_excel()
我们将在本节后面探讨其中一些方法。
如果我们想导入一个.csv
不在工作目录中的文件,则需要read_csv
稍微修改该方法的语法。
如果文件位于比您现在正在使用的文件夹更深的文件夹中,则需要在read_csv
method参数中指定文件的完整路径。例如,如果stock_prices.csv
文件包含在名为的文件夹中new_folder
,那么我们可以这样导入它:
new_data_frame = pd.read_csv('./new_folder/stock_prices.csv')
对于那些不熟悉使用目录符号的人,文件.
路径开头的表示当前目录。同样,a ..
表示当前目录上方的一个目录,而a ...
表示当前目录上方的两个目录。
这种语法(使用句点)正是我们引用(和导入)当前工作目录上方的文件的方式。例如,打开new_folder
文件夹内的Jupyter Notebook ,并将其放置stock_prices.csv
在父文件夹中。使用此文件布局,您可以stock_prices.csv
使用以下命令导入文件:
new_data_frame = pd.read_csv('../stock_prices.csv')
请注意,此目录语法对于所有类型的文件导入都是相同的,因此在本课程稍后的内容中探索不同的导入方法时,我们将不会再讨论如何从不同的目录导入文件。
如何.csv
使用熊猫导出文件
为了演示如何保存新.csv
文件,我们首先创建一个新的DataFrame。具体来说,让我们使用以下np.random.randn
方法用随机数据填充3列50行的DataFrame :
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(50,3))
现在我们有了一个DataFrame,我们可以使用to_csv
方法保存它。此方法将新文件的名称作为其参数。
df.to_csv('my_new_csv.csv')
您将注意到,如果运行上面的代码,新.csv
文件将以一个未标记的列开头,该列包含DataFrame的索引。下面是一个示例(.csv
在Microsoft Excel中打开后):
在许多情况下,这是不希望的。要删除空白索引列,请将index=False
第二个参数传递给该to_csv
方法,如下所示:
new_data_frame.to_csv('my_new_csv.csv', index = False)
新.csv
文件没有未标记的索引列:
在read_csv
与to_csv
从方法使其很容易导入和导出数据.csv
使用熊猫文件。我们将在本节的后面看到,对于read
允许我们导入数据的每种方法,通常都有一个相应的to
函数可以使我们保存数据!
如何.json
使用熊猫导入文件
如果您没有使用大型数据集的经验,那么您可能不熟悉JSON文件类型。
JSON代表JavaScript对象符号。JSON文件与Python字典非常相似。
JSON文件是软件开发人员中最常用的数据类型之一,因为它们基本上可以使用每种编程语言进行操作。
Pandas有一种称为的方法read_json
,可以很容易地将JSON文件作为pandas DataFrame导入。下面是一个示例。
json_data_frame = pd.read_json('stock_prices.json')
接下来,我们将学习如何导出JSON文件。
如何出口 .json
使用熊猫文件
如前所述,通常to
每种read
方法都有一种方法。这意味着我们可以使用以下命令将DataFrame保存到JSON文件:to_json
方法。
例如,让我们df
从本节前面的内容中随机生成的DataFrame ,并将其另存为JSON文件到我们的本地目录中:
df.to_json('my_new_json.json')
我们将学习如何使用Excel文件-具有文件扩展名的文件 .xlsx
。
如何汇入 .xlsx
使用熊猫文件
Pandas的read_excel
方法非常容易将数据从Excel文档导入pandas DataFrame:
new_data_frame = pd.read_excel('stock_prices.xlsx')
与本节前面探讨的read_csv
和read_json
方法不同,该read_excel
方法可以接受第二个参数。read_excel
接受多个参数的原因是Excel电子表格可以包含多个工作表。第二个参数指定要尝试导入的工作表,并称为sheet_name
。
例如,如果我们stock_prices
有第二个工作表称为Sheet2
,则可以将该工作表导入到pandas DataFrame中,如下所示:
new_data_frame.to_excel('stock_prices.xlsx', sheet_name='Sheet2')
如果您没有为指定任何值sheet_name
,则read_excel
默认情况下将导入Excel电子表格的第一张表。
导入Excel文档时,请务必注意,熊猫仅导入数据。它不能导入其他Excel功能,例如格式,公式或宏。尝试从具有这些功能的Excel文档中导入数据可能会导致熊猫崩溃。
如何.xlsx
使用熊猫导出文件
导出Excel文件与导入Excel文件非常相似,不同之处to_excel
在于我们使用代替read_excel
。下面是一个使用我们随机生成的df
DataFrame的示例:
df.to_excel('my_new_excel_file.xlsx')
像一样read_excel
,to_excel
接受第二个参数,该参数sheet_name
允许您指定要保存的工作表的名称。例如,我们可以通过将新.xlsx
文件的表单My New Sheet!
传递给这样的to_excel
方法来命名该表单:
df.to_excel('my_new_excel_file.xlsx', sheet_name='My New Sheet!')
如果您未指定的值sheet_name
,则工作表将被命名为Sheet1
默认情况下(就像使用实际应用程序创建新的Excel文档时一样)。
熊猫中的远程数据输入和输出(I / O)
在这个过程中的最后一节,我们学习了如何从导入数据.csv
,.json
以及.xlsx
已保存我们的本地计算机上的文件。我们将通过向您展示如何导入文件而无需先将其实际保存到本地计算机上来进行跟进。这称为remote importing
。
什么是远程导入,为什么有用?
远程导入意味着将文件带入您的Python脚本,而无需将该文件保存在计算机上。
从表面上看,似乎不清楚为什么我们要进行远程导入。但是,它可能非常有用。
远程导入之所以有用的原因是,按照定义,这意味着即使导入的文件未保存在计算机上,Python脚本也将继续起作用。这意味着我可以将代码发送给同事或朋友,它仍然可以正常运行。
在本节的其余部分,我将演示如何执行远程大熊猫进口的.csv
,.json
和.xlsx
文件。
如何导入遥控器 .csv
文件
首先,导航到本课程的GitHub Repository。打开stock_prices
文件夹。单击文件stock_prices.csv
,然后单击文件按钮Raw
,如下所示。
这将带您进入一个新页面,该页面.csv
包含文件中包含的数据stock_prices.csv
。
要将此远程文件导入到您的Python脚本中,必须首先将其URL复制到剪贴板。您可以通过(1)突出显示整个URL,右键单击所选文本,然后单击copy
,或(2)突出显示整个URL并在键盘上键入CTRL + C来执行此操作。
该URL将如下所示:
[https://raw.githubusercontent.com/nicholasmccullum/advanced-python/master/stock_prices/stock_prices.csv](https://raw.githubusercontent.com/nicholasmccullum/advanced-python/master/stock_prices/stock_prices.csv)
您可以将此URL传递到read_csv
方法中,以将数据集导入pandas DataFrame中,而无需先将数据集保存到计算机中:
pd.read_csv('https://raw.githubusercontent.com/nicholasmccullum/advanced-python/master/stock_prices/stock_prices.csv')
如何导入远程.json
文件
我们可以.json
以类似于文件的方式导入远程.csv
文件。
首先,从GitHub获取原始URL。它看起来像这样:
https://raw.githubusercontent.com/nicholasmccullum/advanced-python/master/stock_prices/stock_prices.json
接下来,将此URL传递给这样的read_json
方法:
pd.read_json('https://raw.githubusercontent.com/nicholasmccullum/advanced-python/master/stock_prices/stock_prices.json')
如何导入远程.xlsx
文件
我们可以.xlsx
以类似于.csv
和.json
文件的方式导入远程文件。请注意,您需要在GitHub界面上单击稍有不同的位置。具体来说,您需要右键单击“查看原始数据”,然后选择“复制链接地址”,如下所示。
原始网址如下所示:
https://github.com/nicholasmccullum/advanced-python/blob/master/stock_prices/stock_prices.xlsx?raw=true
然后,将此URL传递给read_excel
方法,如下所示:
pd.read_excel('https://github.com/nicholasmccullum/advanced-python/blob/master/stock_prices/stock_prices.xlsx?raw=true')
远程导入的弊端
远程导入意味着您无需先将要导入的文件保存到本地计算机上,这无疑是有好处的。
但是,远程导入也有两个缺点:
- 您必须具有Internet连接才能执行远程导入
- 对URL进行Ping操作以检索数据集非常耗时,这意味着执行远程导入会降低Python代码的速度