入门数据分析,我们往往都绕不开Pandas——这个功能强大的库彻底改变了我们在Python中处理和操纵数据的方式。
在这个速成课程中,我们将逐一解析30个最常用的Pandas函数,这些函数是任何数据分析任务的核心。无论你是经验丰富的“老司机”(数据科学家🤭),还是初探数据世界的“雏鸟”(新手🤭),这些函数都将成为你进行数据分析时的首选工具。
为了说明这30个最常用的Pandas函数的用法,我们将使用 Faker 库创建一个贴近真实世界的数据集——电商销售交易数据:
import pandas as pd
from faker import Faker
import random
fake = Faker('zh_CN')
rows = 100
cols = ['Date', 'Product', 'Sales', 'Region']
products = [
'电视', '冰箱', '微波炉', '智能手机', '平板电脑',
'笔记本电脑', '咖啡机', '空气净化器', '耳机', '洗衣机'
]
data = []
for _ in range(100):
date = fake.date_between(start_date='-1y', end_date='today')
product = random.choice(products)
sales = random.randint(10, 100)
region = random.choice([fake.city() for _ in range(20)])
data.append([date, product, sales, region])
df = pd.DataFrame(data, columns=cols)
df.to_csv('datasets/sale_transactions.csv', index=False)
接下来,让我将这30个函数分别应用到该数据集上。
import pandas as pd
df = pd.read_csv('datasets/sale_transactions.csv')
df.head()
使用 info() 函数获取DataFrame的简明摘要,包括数据类型和非空值。describe() 函数提供数值列的统计信息,如均值、标准差和四分位数。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 100 non-null object
1 Product 100 non-null object
2 Sales 100 non-null int64
3 Region 100 non-null object
dtypes: int64(1), object(3)
memory usage: 3.3+ KB
df.describe()
在做数据预处理的时候,由于原始数据质量常常参差不齐,会包含缺失值。所以必须对缺失值进行处理。常见的处理方式包括:直接删除(dropna())或用特定值进行填充(fillna())。
df.dropna()
df.fillna('null')
演示从DataFrame中选择列。使用单个括号选择单列,使用双括号选择多个列。此外,还可以通过 loc 函数达到相同的选择效果。
# 以下两种方式都可以选择“Product”列
df['Product']
# df.loc[:, 'Product']
# 以下两种方式都可以选择'Product', 'Sales'两列
df[['Product', 'Sales']]
# df.loc[:, ['Product', 'Sales']]
可以按条件对行进行过滤并提取符合条件的行。支持单条件或多个组合条件多虑。
df[df['Product'].isin(['智能手机', '耳机'])]
df[(df['Product'].isin(['智能手机', '耳机'])) & (df['Sales'] > 20)]
根据特定列对数据框进行排序是数据分析中常见的操作。支持根据单列或多列按照指定的排序方式对数据进行排序。
Sales 列按降序排序。df.sort_values(by='Sales', ascending=False)
Product 和 Sales 列进行排序,其中 Product 列升序,Sales 列降序。df.sort_values(by=['Product', 'Sales'], ascending=[True, False])
按照分类列(区域)对数据进行分组,并计算每个分组的'Sales'列的均值。
df.groupby('Region')['Sales'].mean()
使用 apply() 将一个自定义函数(在本例中是销量加倍)应用于'Sales'列中的每个元素。
df['Sales'].apply(lambda x: x * 2)
我们还可以单独新增一列计算加倍销量,这样看起来更加直观。为了不影响原始数据,这里我们拷贝一份原数据,然后在拷贝数据上操作:
df_tmp = df.copy()
df_tmp['Sales_double'] = df_tmp['Sales'].apply(lambda x: x * 2)
df_tmp
按垂直方向连接数据框(DataFrame),即列相同,行增加:
df_concat = pd.concat([df, df], ignore_index=True)
df_concat
参数ignore_index=True表示合并后的数据索引为默认索引(从0开始自增)。
将包含日期信息的列转换为日期时间格式并将其设置为DataFrame的索引,这对于时间序列分析至关重要。
# 将数据类型转换为时间格式
df['Date'] = pd.to_datetime(df['Date'])
# 将时间列设置为索引
df.set_index('Date', inplace=True)
df
按月 ('M') 重新采样时间序列数据并计算均值。这对于改变数据频率非常有用。
df['Sales'].resample('ME').mean()
新增列很简单,如果你注意到的话,其实我们在上面的第8个示例中就实现过。这里我们新增一列“收入”(Revenue),为销量的1.5倍:
df['Revenue'] = df['Sales'] * 1.5
df
根据指定列消除重复行,确保数据的唯一性。比如,下面我们根据所有列删除重复行:
df.drop_duplicates()
根据结果可以看出我们的数据中不存在重复行(因为原始数据就有100行)。
假设我们根据“Product”和“Sales”两列进行去重,看看结果如何:
df.drop_duplicates(subset=['Product', 'Sales'])
从输出结果可以看出,存在13行重复数据(因为结果只剩下87行)。另外,请注意💡,以上去重方式并不会影响原数据,只是产生一个新的拷贝而已。如果想要就地修改原数据,则需要在去重方法中增加inplace=True参数。
文本处理是数据分析中的常见操作。比如,检查包含关键字“机”的所有产品:
df['Product-check'] = df['Product'].str.contains('机')
df
将列转换为分类数据类型。在处理有限的唯一值时,对于节省内存和提高性能比较有用。比如,将地区列转换为分类数据类型:
df['Region'] = pd.Categorical(df['Region'])
df.dtypes
创建数据透视表可以对数据进行总结和分析。下面的示例计算了每个“地区”不同“产品”的销售总额:
df_pivot_table = pd.pivot_table(df, values='Sales',
index='Region', columns='Product',
aggfunc='sum', observed=False)
df_pivot_table
基于共同列(比如 'Region')将两个 DataFrame 合并,从而合并来自两个数据集的信息(水平方向合并)。
managers = zip(df['Region'].unique().tolist(), [fake.name() for _ in range(100)])
df_managers = pd.DataFrame(managers, columns=['Region', 'Manager'])
merged_df = pd.merge(df, df_managers, on='Region')
merged_df
“注意:如果两个数据框中的合并关联列名不一致(假设df中关联列为“Region_A”,df_managers中关联列为“Region_B”),则在
merge方法中的关联列应分别列出:pd.merge(df, df_managers, left_on='Region_', right_on='Region_B')。此外,如果你对SQL熟悉的话,这种合并方式其实与SQL中的内连接一样。
新增一列('Cumulative_Sales'),计算随着时间推移 'Sales' 列的累计总和。
# 删除产品类型检查列“Product-check”
del df['Product-check']
df['Cumulative_Sales'] = df['Sales'].cumsum()
df
在指定的窗口大小(在此示例中为2)上计算滚动统计数据,例如平均值。对于平滑时间序列数据中的波动非常有用。
df['Rolling_Mean'] = df['Sales'].rolling(window=2).mean()
df
识别并替换 'Sales' 列中的异常值。比如,超出某个阈值的异常值将被替换为中位数值。
import numpy as np
threshold = df['Sales'].mean() + 2 * df['Sales'].std()
df['Sales'] = np.where(df['Sales'] > threshold, df['Sales'].median(), df['Sales'])
df
将“Sales”列中的值移动一个周期。用于比较当前值和前一个值。
df['Shifted_Sales'] = df['Sales'].shift(periods=1)
df
计算“Sales”列的百分比变化。用于分析连续值之间的变化率。
df['Sales_Percentage_change'] = df['Sales'].pct_change() * 100
df
生成一个相关性矩阵,量化数据框中数值变量之间的关系。
numerical_df = df.select_dtypes(include=[np.number])
corr_matrix = numerical_df.corr()
corr_matrix
使用Pandas和Matplotlib绘制'Sales'列的折线图来对数据进行可视化。
import matplotlib.pyplot as plt
df['Sales'].plot(kind='line')
plt.show()
折线图看起来简直就是“剪不断理还乱”,不用在意,因为数据都是随机生成的。关注图形绘制方法即可。
其实在最开始我们进行数据准备的时候就用到了保存数据的方法,使用 to_csv() 方法即可。当然,你也可以保存为其他格式的文件(如Excel-to_excel())。
df.to_csv('datasets/sale_transactions.csv', index=False)
# 或者
df.to_excel('datasets/sale_transactions.xlsx', index=False)
检查和优化DataFrame的内存使用,确保高效存储。
# 优化内存使用
df.info(memory_usage='deep')
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 100 entries, 2023-12-29 to 2023-09-24
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Product 100 non-null object
1 Sales 100 non-null float64
2 Region 100 non-null category
3 Revenue 100 non-null float64
4 Cumulative_Sales 100 non-null int64
5 Rolling_Mean 99 non-null float64
6 Shifted_Sales 99 non-null float64
7 Sales_Percentage_change 99 non-null float64
dtypes: category(1), float64(5), int64(1), object(1)
memory usage: 25.5 KB
agg 方法自定义聚合类型使用 agg 函数将自定义聚合应用于特定列。在下面的示例中,我们计算 'Sales' 的总和和 'Revenue' 的平均值。
df.agg({'Sales': 'sum', 'Revenue': 'mean'})
将数值数据('Sales' 列)划分为离散区间(箱),并分别为每个间隔打上标签。
df['Sales_Bin'] = pd.cut(df['Sales'], bins=[0, 100, 150, 200],
labels=['Low', 'Medium', 'High'])
df
识别“Product”列中的唯一值。有助于了解分类列中存在的不同类别。
unique_products = df['Product'].unique()
unique_products
计算“Product”列中每个唯一值的出现次数。有助于理解分类数据的分布。
product_count = df['Product'].value_counts()
product_count
以上示例通过一个虚拟销售数据集,将30个最常用的Pandas函数应用到该数据集上,加深您对这些函数的理解和应用。您可以根据您的具体用例和数据集进行调整和修改这些代码片段。祝您编码愉快!🐼🚀
“如果你觉得这篇文章对你有用,请“点赞➕关注”支持我!关注我,带你解锁更多Python实用技能、数据分析知识以及更多AI工具和新玩法!
Thank you for reading!
- END -
推荐阅读👇👇👇
Python效率秘籍:使用“*” 和“/” 让你的函数参数看起来更整洁
Pandas高级功能:提升您的数据处理技能。值得一看!(建议收藏~~)
原文作者:数据派探险家;如有侵权,请联系管理员删除。