掌握 40 道实战练习题,让你轻松玩转 Python !
Pandas 是使用最广泛的数据分析和操作库之一。它提供了许多功能和方法来清理、处理、操作和分析数据。
本文我将列出 40 个示例,不仅包括常用函数和操作技巧,还包括一些功能强大却非常低调的技巧,这些示例让你轻松玩转 Python。文中数据文末可以获取!
1、读取 csv 文件
read_csv 提供了将 csv 文件读取到 Pandas 数据帧的灵活方式。
import numpy as np
import pandas as pd
marketing = pd.read_csv("DirectMarketing.csv")
groceries = pd.read_csv("Groceries_dataset.csv")
2、使用 astype 更改数据类型
日期需要存储在日期时间数据类型中,以便使用 pandas 的日期时间函数,查看数据框的数据类型。
groceries.dtypes
我们也可以使用 astype 函数更改数据类型。
groceries['Date'] = groceries['Date'].astype("datetime64")
groceries.dtypes
Member_number int64
Date datetime64[ns]
itemDescription object
3、使用 to_datetime 更改数据类型
我们还可以使用 to_datetime 为日期分配适当的数据类型。语法与 astype 函数略有不同。
groceries['Date'] = pd.to_datetime(groceries['Date'])
4、分析日期
在第一个示例中,我提到 read_csv 在读取 csv 文件方面非常灵活。它还可以处理日期。我们可以在读取数据时为日期分配适当的数据类型。这将使我们不必在以后更改数据类型。
groceries = pd.read_csv("Groceries_dataset.csv", parse_dates=['Date'])
groceries.dtypes
Member_number int64
Date datetime64[ns]
itemDescription object
5、使用 isin 方法进行筛选
有许多方法可以基于值筛选数据框。我们可以使用逻辑运算符。
isin 方法允许基于一组特定的值进行筛选。我们可以只传递要筛选的值的列表。
groceries[groceries.Member_number.isin([3737, 2433, 3915, 2625])].shape
6、~ 操作符
波浪(~)运算符可理解为"不"。例如,我们可以在上一示例中找到筛选行的补充,只需在开头添加波浪线运算符。
groceries[~groceries.Member_number.isin([3737, 2433, 3915, 2625])].shape
(38639, 3)
7、值计数与规范化
value_counts是最常用的函数之一。它计算每个值的匹配次数并返回一个序列。如果与规范化参数一起使用,我们会获得发生百分比的概览。
marketing.Catalogs.value_counts(normalize=True)
8、将列设置为索引
默认情况下,Pandas 会为数据框分配整数索引,但我们也可以使用"索引"函数set_index。
例如,我们可以将日期列设置为数据框的索引。
groceries.set_index('Date', inplace=True)
9、重置索引
删除某些行时,pandas 不会自动重置索引。同样,当两个数据框串联时,不会重置索引。在这种情况下,新数据框将不具有连续索引值。
在这种情况下,可以实用 reset_index 函数。
groceries.reset_index(drop=True, inplace=True)
如果我们不设置为 True,则旧索引将作为数据帧中的新列保留。
10、unique
unique 函数返回列中唯一值的数组。
groceries['itemDescription'].unique()[:5]
array(['tropical fruit', 'whole milk', 'pip fruit', 'other vegetables','rolls/buns'], dtype=object)
11、创建较大尺寸的随机样本
sample 函数可用于创建数据帧的随机样本。在机器学习中处理不平衡数据集时,它会派上用场。
我们只能创建小于原始样本的样本,除非替换参数更改为 true。让我们只使用花费少于 300 的来创建数据框的随机样本。
less = marketing[marketing.AmountSpent < 300].sample(n=400, replace=True)
less.shape
(400, 10)
12、组合数据框
我们可以水平或垂直地将数据帧与串联函数串联。
less.shape, marketing.shape
((400, 10), (1000, 10))
new = pd.concat([marketing, less])
new.shape
(1400, 10)
13、按索引选择行和列的范围
我们可以使用 iloc 函数选择行和列的范围。它接受所需行和列的索引。
例如,我们可以选择前 4 行和前 3 列,如下所示:
marketing.iloc[:4,:3]
14、按索引选择特定行和列
iloc 函数还接受值数组而不是范围。我们可以传递一个列表或数字数组。
toselect = np.random.randint(100, size=7)
marketing.iloc[toselect, [2,4,6]]
15、按标签选择行和列
loc 函数与 iloc 函数一样,但它接受标签而不是索引
marketing.loc[toselect,['Gender','Age','Age','Catalogs']]
16、从日期提取年和月
pandas 提供了许多功能,在日期操作上,可以通过 dt 进行操作使用。
我们可以轻松地从日期中提取日期和月份,如下所示:
groceries['Year'] = groceries['Date'].dt.year
groceries['Month'] = groceries['Date'].dt.month
17、删除列和行
在上一个示例中,我们创建了两个新列。默认情况下,panas 在数据框的末尾添加新列,但我们可以更改它。
我们将在下一个示例中在特定位置添加新列。但是,我们首先需要删除它们,这可以通过使用 drop 函数完成。
groceries.drop(['Year','Month'], axis=1, inplace=True)
18、插入列
如果将年和月份列放在日期列之前,则它们可能更好。我们可以使用插入函数来完成此任务
year = groceries['Date'].dt.year
month = groceries['Date'].dt.month
groceries.insert(1, 'Month', month)
groceries.insert(2, 'Year', year)
19、替换值
在上一个示例中,我们创建了一个包含表示月数的月份列。你可能希望此列包含月份的名称(即 1 月、2 月等)。
有多种方法可以执行此操作。我先告诉你更困难的方式。在下面的示例中,我们将看到一个更简单的方法。
我们可以使用替换函数将整数替换为月份名称字符串。
month_names = {1:'January', 2:'February', 3:'March', 4:'April',5: 'May', 6:'June', 7:'July', 8:'August', 9:'September',10:'October', 11:'November', 12:'December'}
groceries.Month.replace(month_names, inplace=True)
我们创建了一个字典,然后将其传递给替换函数。
20、month_name
执行上一步有更简单的方法。
groceries['Month'] = groceries['Date'].dt.month_name()
21、累计和
累积函数允许基于另一列的累积总和创建列。
marketing['CumAmountSpent'] = marketing['AmountSpent'].cumsum()
marketing
22、字符串筛选
str提供了许多功能和方法,可以加快处理文本数据。
例如,我们可以检查字符串是否包含一组特定的字符。典型的用法是否包含单词。
groceries.itemDescription.str.contains('milk').sum()
groceries.itemDescription.str.contains('whole milk').sum()
23、根据长度字符串筛选
我们还可以根据长度(即字符数)筛选字符串。
groceries[groceries.itemDescription.str.len() > 20]\
.itemDescription.unique()
array(['fruit/vegetable juice', 'packaged fruit/vegetables','frozen potato products', 'Instant food products','female sanitary products', 'house keeping products','chocolate marshmallow', 'long life bakery product','flower soil/fertilizer', 'preservation products'], dtype=object)
24、绘制变量的分布
pandas 不是数据可视化库,因此未针对可视化任务进行优化。然而,它提供了绘图函数,我认为这使得它非常方便地生成基本绘图。
例如,我们可以创建 kde 绘图以查看工资列的分布。
marketing.Salary.plot(kind='kde', title='Distribution of Salary',figsize=(10,6))
25、创建直方图
我们也可以使用绘图函数来生成直方图。
marketing.Salary.plot(kind='hist', title='Distribution of Salary',figsize=(10,6))
26、月销售额趋势
在此示例中,我们将合并几个操作以创建显示月销售额趋势的绘图。
groceries['month_name'] = groceries['Date'].dt.month_name()
groceries[['month_name','Date']].groupby('month_name').count().plot(title="Monthly Sales", figsize=(10,6))
27、不同列的不同聚合功能
可以按函数对组中的不同列应用不同的聚合函数。我们可以传递一个字典来指示哪些函数将应用于哪些列。
marketing[['Married','Salary','AmountSpent']].groupby(['Married']).agg({'Salary':'mean', 'AmountSpent':'sum'})
28、NamedAgg
我们将执行与上一示例中相同的操作,更改结果中的列名称。
marketing[['Married','Salary','AmountSpent']].groupby(['Married']).agg(
Average_salary = pd.NamedAgg('Salary', 'mean'),
Total_spent = pd.NamedAgg('AmountSpent', 'sum'))
29、交叉表功能
交叉选项卡函数用于基于指定的列、值和聚合函数创建交叉表。它类似于数据透视表。
例如,我们可以计算年龄和性别列之间交叉类别的平均工资。
pd.crosstab(index=marketing.Age, columns=marketing.Gender, values=marketing.Salary, aggfunc='mean').round(1)
30、交叉表函数-2
我们将使用交叉表函数执行一个稍微复杂一些的示例。我们可以传递多个列,并显示总体值。
pd.crosstab(index=[marketing.Age, marketing.Married], columns=marketing.Gender,values=marketing.Salary, aggfunc='mean',margins=True).round(1)
31、Pivot_table
它非常类似于交叉表函数,语法上存在一些小差异。我将创建与上一个示例相同的表,使用 pivot_table 函数。
pd.pivot_table(data=marketing, index=['Age', 'Married'], columns='Gender', values='Salary', aggfunc='mean',margins=True).round(1)
32、拆分字符串
字符串访问器可用于拆分或合并字符串。例如,我们可以拆分数据框中日期的部分以获取日期、月份和年。
请注意,数据类型应为对象或字符串,以便能够应用 str。
groceries['month'] = groceries['Date'].str.split('-', expand=True)[1]
33、在字符级别拆分字符串
我们可以根据字符的位置选择字符串的一部分。考虑前面的示例。我们可能想要检索这些年的最后两个字符。str 访问器允许在字符串上编制索引。
groceries['year'] = groceries['Date'].str.split('-', expand=True)[2].str[-2:]
34、sidetable 侧表
sidetable是 pandas 的附加组件,它使得创建数据框摘要更加容易。它可以被视为值计数和交叉选项卡函数的组合。
pip install sidetable
import sidetable
groceries.stb.freq(['itemDescription'], thresh=25)
Freq 函数返回一个数据帧,该数据框传达了 3 条信息。
每个类别(或value_counts)的观测值数(即行)。 整个列(下列(正常=true)中每个value_counts的百分比。 上述两个的累积版本。
sidetable 提供了更多的功能。如果你刚兴趣可以进一步了解。
35、查找缺失值
缺少值需要非常仔细地处理,以便进行准确和可靠的分析。
isna 函数可以使用 查找数据帧中缺失的值。如果缺少该值,则返回 true。因此,我们可以通过应用 sum 函数来计算缺失值的总数。
groceries.isna().sum()
Member_number 0
Date 0
itemDescription 0
36、处理缺失值
填充函数可用于处理缺失值。它提供了许多选项来填充缺失的值,如平均值、中位数或常量值。
我们还可以使用上一个或下一个值来填充缺失的值。
让我们首先将几个值更改为数据帧中的缺失值。
groceries.iloc[[1,10,30], [1,2]] = np.nan
groceries.isna().sum()
Member_number 0
Date 3
itemDescription 3
我们可以使用最常见的项来填充项目描述列中缺少的值。对于日期列,我们将使用上一个值替换缺失值。
groceries['itemDescription'].fillna(value=groceries['itemDescription'].mode()[0], inplace=True)
groceries['Date'].fillna(method='ffill', inplace=True)
groceries.isna().sum()
Member_number 0
Date 0
itemDescription 0
37、选择数据类型
可以使用select_dtypes函数选择属于或不属于特定数据类型的列。
marketing.select_dtypes(include='object').columns
Index(['Age', 'Gender', 'OwnHome', 'Married', 'Location', 'History'], dtype='object')
marketing.select_dtypes(exclude='object').columns
Index(['Salary', 'Children', 'Catalogs', 'AmountSpent'], dtype='object')
38、创建数据帧
DataFrame 函数可用于创建数据帧。字典可以传递到 DataFrame 函数。键将是列名称,值将表示行值。
让我们创建一个数据框。
unique_items = groceries.itemDescription.unique()
prices = pd.DataFrame({
'itemDescription': unique_items,
'prices':np.random.randint(10, size=len(unique_items))})
39、合并数据帧
合并函数可用于基于共享列或列合并两个数据框。例如,我们可以根据物料描述列合并数据框。
merged_df = groceries.merge(prices, on='itemDescription')
40、相关性
在执行机器学习任务时,需要考虑数值变量之间的相关性。
corr 函数计算相关性并返回包含变量之间相关系数的矩阵。
文中数据领取方式:
长按扫码,发消息 [40]