前言
本文是关于数据分析、科学计算与可视化的习题整理和讲解
13.1
假设已执行语句import numpy asnp和x=np.array((1,2,3,45)),那么表达式 sum(x*2)的值为
结果是30,因为数组x中的元素是[1, 2, 3, 4, 5],将每个元素乘以2后得到[2, 4, 6, 8, 10],然后将这些元素相加得到30。
13.3
表达式np.random.randn(3).shape 的值为
结果为:
一个一行三列的矩阵
(3,)
扩展:
一个三行四列的矩阵
(3,4)
13.6
np.argmax(x)
是一个NumPy函数,它用于找出数组 x
中最大元素的索引位置。在多维数组中,argmax
默认返回最大元素的第一个索引。如果数组中有多个相同的最大值,它返回遇到的第一个最大值的索引。
函数的基本语法是:
np.argmax(array, axis=None, out=None)
array
:要在其上找到最大元素索引的输入数组。axis
:沿哪个轴(维度)查找最大值。如果不指定(None
),函数会在扁平化后的数组上操作。out
:一个可选的输出数组,如果提供,结果将被存储在这个数组中。
对于一维数组,使用非常简单:
import numpy as np
x = np.array([3, 5, 1, 4, 2])
index_of_max_value = np.argmax(x)
如果 x
是上面定义的数组,np.argmax(x)
将会返回 1
,因为在数组 x
中,元素 5
是最大值,它位于索引 1
的位置(索引从 0
开始计数)。
对于多维数组,如果指定了 axis
参数,argmax
会返回该轴上的最大值索引。例如:
import numpy as np
x = np.array([[1, 2], [3, 4]])
index_of_max_value_along_axis = np.argmax(x, axis=1)
在这个例子中,index_of_max_value_along_axis
将会返回数组 [1, 1]
,因为沿着轴 1
(列),每一列的最大值分别是第二列的 2
和第二行的 4
,它们的索引分别是 1
和 1
。
这里的话最大的值是9,位置是3(注意0开始)
13.7
Pandas 库中的 DataFrame
对象的 sort_values()
方法用于对数据框(DataFrame)进行排序。这个方法非常灵活,可以根据一个或多个列的值对行进行排序,并且可以选择升序或降序。
以下是 sort_values()
方法的一些关键参数:
by
:用于排序的列名或列名列表。这是必需的参数,指定了要根据哪些列的值来排序。axis
:指定沿哪个轴排序,默认为0
,表示沿着行(即默认按列排序)。ascending
:一个布尔值或布尔值列表,用于指定排序的方向。如果为True
,则升序排序;如果为False
,则降序排序。可以对不同的列指定不同的排序方向。inplace
:布尔值,表示排序是否直接在原始 DataFrame 上进行。如果为True
,则原地修改并返回None
;如果为False
(默认),则返回一个新的 DataFrame,并保持原始 DataFrame 不变。kind
:指定排序算法的类型,可选值有'quicksort'
、'mergesort'
或'heapsort'
,但在大多数情况下,Pandas 会自动选择最合适的算法。
下面是一个使用 sort_values()
方法的示例:
import pandas as pd
# 创建一个简单的DataFrame
df = pd.DataFrame({
'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Age': [45, 22, 36, 28],
'Salary': [70000, 35000, 48000, 59000]
})
# 根据Age列进行升序排序
df_sorted_by_age = df.sort_values(by='Age')
# 根据Salary列进行降序排序,同时根据Age列进行升序排序
df_sorted_by_salary_and_age = df.sort_values(by=['Salary', 'Age'], ascending=[False, True])
# 原地对Age列进行升序排序
df.sort_values(by='Age', inplace=True)
使用 sort_values()
方法可以根据数据的需要进行多种排序操作
13.8
describe():这个方法会自动计算数值型列的计数、平均值、标准差、最小值和最大值。对于非数值列,它不会产生描述性统计。
13.9
Pandas库中的 DataFrame
对象的 head()
方法用于查看该数据框的前几行,默认情况下显示前5行。这个方法非常适合对数据框进行快速的初步检查,了解其结构和前几条记录的样子。
head()
方法的基本用法
df.head(n=5)
n
:一个整数,表示要返回的行数。默认值为5。
示例
假设一个名为 df
的 DataFrame
:
import pandas as pd
# 创建一个简单的DataFrame
df = pd.DataFrame({
'Column1': [1, 2, 3, 4, 5, 6],
'Column2': ['A', 'B', 'C', 'D', 'E', 'F']
})
使用 head()
方法查看前几行:
print(df.head()) # 默认显示前5行
如果想要查看前3行,可以指定 n
参数:
print(df.head(3)) # 显示前3行
注意
- 如果
DataFrame
中的行数少于n
,那么head()
方法将返回所有行。 head()
方法不会修改原始的DataFrame
,它只是返回一个新的视图(或拷贝),除非DataFrame
中的数据是不可变类型。
head()
是Pandas中用于数据探索和分析的众多便捷方法之一。与之相对的是 tail()
方法,它用于查看数据框的最后几行。
13.18
在Pandas库中,DataFrame
对象的 fillna()
方法用于填充数据中的缺失值。fillna()
方法中的 inplace
参数决定了是否在原始DataFrame上进行修改。
inplace
参数
-
如果
inplace
设置为True
,则fillna()
方法会直接在原始DataFrame上进行修改,即原地修改数据,而不返回新的DataFrame对象。这意味着原始DataFrame中的缺失值将被指定的值替换,并且没有新的DataFrame被创建。 -
如果
inplace
设置为False
(这默认值),则fillna()
方法会返回一个新的DataFrame对象,其中包含填充后的值,而原始DataFrame保持不变。
示例
假设我们有一个包含缺失值的DataFrame:
import pandas as pd
# 创建一个包含缺失值的DataFrame
df = pd.DataFrame({
'A': [1, 2, None, 4],
'B': [None, 2, 3, 4]
})
使用 fillna()
方法填充缺失值,并设置 inplace=True
以原地修改:
df.fillna(value=0, inplace=True)
在这个例子中,原始的 df
DataFrame中的所有缺失值(None
)将被数字 0
替换。由于 inplace=True
,这个修改直接发生在原始DataFrame df
上,并没有产生或返回一个新的DataFrame。
注意
- 使用
inplace=True
时,需要谨慎,因为这会更改原始数据,如果后续需要原始数据而没有备份,可能会造成问题。 - 在某些情况下,如果DataFrame很大,原地修改可以节省内存,因为不需要创建并存储一个新的DataFrame对象。
- 并非所有的Pandas方法都提供
inplace
参数,但许多用于修改DataFrame的方法都包含这个选项。
13.11
扩展库Pandas中DataFrame 对象的分组,分组后的对象支持 sum()、mean()等方法进行分组计算。
在Pandas中,groupby()
是一个非常强大的方法,它允许我们对DataFrame进行分组操作,以便对不同的组执行聚合计算。groupby()
主要基于一个或多个键(即列)对数据进行分组,类似于SQL中的 GROUP BY
子句。
groupby()
的基本用法
grouped_df = df.groupby(by=['key1', 'key2'])
by
:一个或多个列名的列表,用于指定分组的依据。
分组后的操作
分组后,可以对每个分组执行各种聚合操作,如:
sum()
:计算每个分组的列的和。mean()
:计算每个分组的列的平均值。max()
:找出每个分组的列的最大值。min()
:找出每个分组的列的最小值。count()
:计算每个分组中的非空元素数量。size()
:返回每个分组的大小,即分组中的行数。std()
:计算每个分组的列的标准差。var()
:计算每个分组的列的方差。
示例
假设我们有一个名为 df
的DataFrame,其中包含了员工的ID、部门和销售额:
import pandas as pd
# 创建一个简单的DataFrame
df = pd.DataFrame({
'Employee': ['John', 'Anna', 'Peter', 'Linda'],
'Department': ['A', 'A', 'B', 'B'],
'Sales': [200, 380, 150, 210]
})
使用 groupby()
对部门进行分组,并计算每个部门的平均销售额:
grouped_by_department = df.groupby('Department')
average_sales_by_department = grouped_by_department['Sales'].mean()
对分组后的数据执行多个聚合操作,可以传递一个聚合函数的字典:
grouped_by_department = df.groupby('Department')
agg_operations = grouped_by_department.agg(
{
'Sales': ['mean', 'sum', 'max']
}
)
注意
- 分组操作返回的是一个
DataFrameGroupBy
对象,它是一个特殊的迭代器,可以用来迭代产生聚合结果。 - 分组操作不会修改原始的DataFrame。
- 可以用
reset_index()
方法来重置分组后DataFrame的索引。
groupby()
是进行数据分析和统计时非常有用的工具
13.12
扩展库Pandas中DataFrame对象的plot()方法用来绘制图形进行可视化,其参数用来指定图形的类型,例如折线图、柱状图、饼状图等。
在Pandas中,DataFrame
对象的 plot()
方法是一个用于快速生成数据图形的便捷方法。该方法实际上是调用了 matplotlib
库的绘图功能,因此它允许用户通过参数来定制图形的多种属性。
kind
参数
kind
参数是 plot()
方法中用于指定图形类型的一个关键参数。不同的 kind
值会生成不同类型的图表:
'line'
:折线图,用于展示连续数据的变化趋势。'bar'
:柱状图,用于展示不同类别的数量差异。'barh'
:水平柱状图,与柱状图相似,但条形是水平的。'hist'
:直方图,用于展示数据分布。'box'
:箱型图,用于展示数据的分布情况及异常值。'kde'
:密度图,用于展示数据的概率分布。'density'
:同'kde'
。'scatter'
:散点图,用于展示两个变量之间的关系。'hexbin'
:六边形分箱图,类似于散点图,但用六边形表示点的密度。'pie'
:饼状图,用于展示每个部分占整体的比例(仅适用于一维数据)。
示例
假设我们有一个名为 df
的DataFrame,其中包含了一列日期和一列销售额:
import pandas as pd
# 创建一个简单的DataFrame
df = pd.DataFrame({
'Date': pd.date_range(start='2021-01-01', periods=5, freq='D'),
'Sales': [230, 410, 350, 280, 390]
})
使用 plot()
方法绘制折线图:
df.plot(kind='line', x='Date', y='Sales')
绘制柱状图:
df.plot(kind='bar', x='Date', y='Sales')
注意
- 使用
plot()
方法时,需要确保已经安装了matplotlib
库。 - 除了
kind
参数,plot()
方法还接受其他参数,如x
和y
用于指定横纵坐标的列,figsize
用于指定图形的大小等。 - 通过
plot()
方法生成的图形可以通过matplotlib
的API进一步定制和优化。
plot()
方法为数据可视化提供了一个快速而简单的入口,使得用户可以迅速生成图形并进行数据分析。
kind 在英语中的意思是“类别”或“种类”