Pandas是Python 数据科学领域最受欢迎的库之一,它提供了高效且灵活的数据结构,使得数据分析变得便利。本文将通过多个案例带大家进一步熟悉Pandas。

在开始之前,请确保您已安装 Pandas 库。您可以使用 pip 进行安装:
pip install pandas
一、数据聚合与分组运算
案例一:apply() 函数
apply() 函数可以将自定义函数应用于 DataFrame 的每一行或每一列。
数据:
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 28, 35],
'City': ['New York', 'London', 'Paris', 'Tokyo']}
df = pd.DataFrame(data)
代码:
# 定义一个函数,将年龄加5
def add_five(age):
return age + 5
# 使用apply()函数将add_five函数应用于'Age'列
df['Age_Plus_Five'] = df['Age'].apply(add_five)
print(df)
输出:
注释:
定义了一个名为 add_five的函数,它接受年龄值为输入,返回加 5 的结果。使用 apply()函数将add_five函数应用于dfDataFrame 的'Age'列。apply()函数会自动将'Age'列中的每个值传递给add_five函数,并将返回值存储在一个新的 Series 中。最后,我们将新的 Series 分配给 dfDataFrame 的新列'Age_Plus_Five'。
案例二:groupby() 函数
groupby() 函数可以根据一个或多个列对数据进行分组,然后对每个组应用聚合函数。
数据:
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
'Gender': ['F', 'M', 'M', 'M', 'F'],
'Score': [80, 75, 90, 85, 95]}
df = pd.DataFrame(data)
代码:
# 根据'Gender'列对数据进行分组,并计算每个性别的平均分数
grouped_df = df.groupby('Gender')['Score'].mean()
print(grouped_df)
输出:
Gender
F 87.5
M 83.33333333333333
Name: Score, dtype: float64
注释:
groupby('Gender')根据'Gender'列对数据进行分组,创建一个DataFrameGroupBy对象。['Score']选择'Score'列聚合。mean()计算每个组的平均分数。
案例三:agg() 函数
agg() 函数可以对分组后的数据应用多个聚合函数。
数据: 使用案例二的数据
代码:
# 对每个性别分组计算分数的平均值、最大值和最小值
grouped_df = df.groupby('Gender')['Score'].agg(['mean', 'max', 'min'])
print(grouped_df)
输出:
注释:
agg(['mean', 'max', 'min'])应用多个聚合函数,并以列表形式传递给agg()函数。
案例四:transform() 函数
transform() 函数对分组后的数据应用函数,并返回与原始 DataFrame 相同大小的结果。
数据: 使用案例二的数据
代码:
# 计算每个学生相对于其性别平均分数的偏差
df['Score_Deviation'] = df.groupby('Gender')['Score'].transform(lambda x: x - x.mean())
print(df)
输出:
注释:
transform(lambda x: x - x.mean())使用匿名函数计算每个值与其组平均值之间的差值。
二、数据透视与重塑
案例五:pivot_table() 函数
pivot_table() 函数可以根据一个或多个列创建数据透视表。
数据:
import pandas as pd
data = {'Date': ['2023-04-01', '2023-04-01', '2023-04-02', '2023-04-02', '2023-04-03'],
'City': ['New York', 'London', 'London', 'Paris', 'Paris'],
'Sales': [100, 150, 200, 180, 250]}
df = pd.DataFrame(data)
代码:
# 创建一个数据透视表,以'Date'作为索引,'City'作为列,'Sales'作为值
pivot_table = df.pivot_table(index='Date', columns='City', values='Sales')
print(pivot_table)
输出:
注释:
index='Date'指定'Date'列作为数据透视表的索引。columns='City'指定'City'列作为数据透视表的列。values='Sales'指定'Sales'列作为数据透视表的值。
案例六:pivot() 函数
pivot() 函数与 pivot_table() 函数类似,但它不允许对数据进行聚合。
数据: 使用案例五的数据
代码:
# 使用pivot()函数创建数据透视表
pivot_table = df.pivot(index='Date', columns='City', values='Sales')
print(pivot_table)
输出:
注释:
pivot()函数的参数与pivot_table()函数相同。
案例七:stack() 函数
stack() 函数可以将 DataFrame 的列索引转换为行索引,从而将数据“堆叠”起来。
数据: 使用案例五的数据透视表结果
代码:
# 将数据透视表堆叠起来
stacked_df = pivot_table.stack()
print(stacked_df)
输出:
注释:
stack()函数将列索引'City'转换为行索引,并将值存储在对应的索引位置。
案例八:unstack() 函数
unstack() 函数可以将 DataFrame 的行索引转换为列索引,从而将数据“展开”。
数据: 使用案例七的堆叠后的 DataFrame
代码:
# 将堆叠后的DataFrame展开
unstacked_df = stacked_df.unstack()
print(unstacked_df)
输出:
注释:
unstack()函数将行索引'City'转换为列索引,并将值存储在对应的索引位置。
案例九:melt() 函数
melt() 函数可以将 DataFrame 从“宽格式”转换为“长格式”。
数据: 使用案例五的数据
代码:
# 将DataFrame从宽格式转换为长格式
melted_df = df.melt(id_vars=['Date', 'City'], value_vars=['Sales'], var_name='Metric', value_name='Value')
print(melted_df)
输出:
注释:
id_vars=['Date', 'City']指定要保留为标识变量的列。value_vars=['Sales']指定要处理为变量的列。var_name='Metric'指定新创建的变量名称列的名称。value_name='Value'指定新创建的列的名称。
三、数据合并与连接
案例十:merge() 函数
merge() 函数可以根据一个或多个键将两个 DataFrame 合并成一个。
数据:
import pandas as pd
data1 = {'CustomerID': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David']}
df1 = pd.DataFrame(data1)
data2 = {'CustomerID': [2, 3, 5],
'City': ['London', 'Paris', 'Tokyo']}
df2 = pd.DataFrame(data2)
代码:
# 根据'CustomerID'列合并两个DataFrame
merged_df = pd.merge(df1, df2, on='CustomerID')
print(merged_df)
输出:
注释:
on='CustomerID'指定'CustomerID'列作为合并的键。
案例十一:concat() 函数
concat() 函数可以将多个 DataFrame 连接成一个。
数据:
import pandas as pd
data1 = {'Name': ['Alice', 'Bob'],
'Age': [25, 30]}
df1 = pd.DataFrame(data1)
data2 = {'Name': ['Charlie', 'David'],
'Age': [28, 35]}
df2 = pd.DataFrame(data2)
代码:
# 将两个DataFrame垂直连接
concatenated_df = pd.concat([df1, df2])
print(concatenated_df)
输出:
Name Age
0 Alice 25
1 Bob 30
0 Charlie 28
1 David 35
注释:
[df1, df2]是一个包含要连接的 DataFrame 的列表。
案例十二:join() 函数
join() 函数可以根据索引将两个 DataFrame 合并成一个。
数据:
import pandas as pd
data1 = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 28]}
df1 = pd.DataFrame(data1, index=[1, 2, 3])
data2 = {'City': ['London', 'Paris'],
'Score': [80, 90]}
df2 = pd.DataFrame(data2, index=[2, 3])
代码:
# 根据索引合并两个DataFrame
joined_df = df1.join(df2)
print(joined_df)
输出:
注释:
join()函数默认使用左连接,即保留左侧 DataFrame 的所有行。
四、时间序列处理
案例十三:resample() 函数
resample() 函数可以对时间序列数据进行重采样。
数据:
import pandas as pd
data = {'Date': pd.to_datetime(['2023-04-01', '2023-04-02', '2023-04-03', '2023-04-04', '2023-04-05']),
'Sales': [100, 150, 200, 180, 250]}
df = pd.DataFrame(data)
df = df.set_index('Date')
代码:
# 将数据重采样为每周的总销售额
resampled_df = df.resample('W')['Sales'].sum()
print(resampled_df)
输出:
Date
2023-04-02 250
2023-04-09 530
Freq: W-SUN, Name: Sales, dtype: int64
注释:
'W'指定重采样的频率为每周。['Sales']选择'Sales'列进行聚合操作。sum()计算每周的总销售额。
案例十四:shift() 函数
shift() 函数可以将数据向上或向下移动指定的位数。
数据:
import pandas as pd
data = {'Sales': [100, 150, 200, 180, 250]}
df = pd.DataFrame(data)
代码:
# 将'Sales'列向下移动一位
df['Previous_Sales'] = df['Sales'].shift(1)
print(df)
输出:
Sales Previous_Sales
0 100 NaN
1 150 100.0
2 200 150.0
3 180 200.0
4 250 180.0
注释:
1指定向下移动一位。
案例十五:rolling() 函数
rolling() 函数可以创建一个指定大小的滚动窗口,并对窗口内的数据应用聚合函数。
数据:
import pandas as pd
data = {'Sales': [100, 150, 200, 180, 250]}
df = pd.DataFrame(data)
代码:
# 创建一个大小为3的滚动窗口,并计算窗口内的平均值
df['Rolling_Mean'] = df['Sales'].rolling(3).mean()
print(df)
输出:
Sales Rolling_Mean
0 100 NaN
1 150 NaN
2 200 150.000000
3 180 176.666667
4 250 210.000000
注释:
3指定滚动窗口的大小。mean()计算窗口内的平均值。
案例十六:diff() 函数
diff() 函数可以计算时间序列数据的一阶差分。
数据: 使用案例十四的数据
代码:
# 计算'Sales'列的一阶差分
df['Sales_Diff'] = df['Sales'].diff()
print(df)
输出:
Sales Sales_Diff
0 100 NaN
1 150 50.0
2 200 50.0
3 180 -20.0
4 250 70.0
注释:
diff()函数默认计算当前值与前一个值之间的差值。
五、缺失值处理
案例十七:fillna() 函数
fillna() 函数可以填充缺失值。
数据:
import pandas as pd
data = {'Sales': [100, 150, None, 180, None]}
df = pd.DataFrame(data)
代码:
# 使用前一个非缺失值填充缺失值
df['Sales_Filled'] = df['Sales'].fillna(method='ffill')
print(df)
输出:
Sales Sales_Filled
0 100.0 100.0
1 150.0 150.0
2 NaN 150.0
3 180.0 180.0
4 NaN 180.0
注释:
method='ffill'指定使用前一个非缺失值填充缺失值。
案例十八:dropna() 函数
dropna() 函数可以删除包含缺失值的行或列。
数据: 使用案例十七的数据
代码:
# 删除包含缺失值的行
df_dropped = df.dropna()
print(df_dropped)
输出:
Sales
0 100.0
1 150.0
3 180.0
注释:
默认情况下, dropna()函数会删除包含缺失值的行。
案例十九:interpolate() 函数
interpolate() 函数可以使用插值法填充缺失值。
数据: 使用案例十七的数据
代码:
# 使用线性插值法填充缺失值
df['Sales_Interpolated'] = df['Sales'].interpolate(method='linear')
print(df)
输出:
Sales Sales_Interpolated
0 100.0 100.0
1 150.0 150.0
2 NaN 165.0
3 180.0 180.0
4 NaN 180.0
注释:
method='linear'指定使用线性插值法填充缺失值。
案例二十:replace() 函数
replace() 函数可以将特定值替换为其他值。
数据: 使用案例十七的数据
代码:
# 将缺失值替换为0
df['Sales_Replaced'] = df['Sales'].replace(np.nan, 0)
print(df)
输出:
Sales Sales_Replaced
0 100.0 100.0
1 150.0 150.0
2 NaN 0.0
3 180.0 180.0
4 NaN 0.0
注释:
replace(np.nan, 0)将NaN值替换为0。
本文介绍了Pandas的一些高级函数的用法的案例,希望这些案例能够帮助大家更好地理解和使用Pandas进行数据分析。