1.需求描述
很多时候,我们需要对一张表格内的数据进行筛选,包括去重,排序,合并表格等。
这次假设你有一张表格,里面有一列Brand记录了汽车的品牌(如比亚迪,特斯拉),一列Model,记录了一类产品(如Model Y),一列Product记录了具体产品型号(如Model Y, Model Y Plus),一列Price记录价格,一列ReleaseDate记录了该车型发布的日期。
你需要筛选出同一个Model中价格最低的产品,如果价格相同,选择最新发布的产品。在另一张表中,也有Model列,你需要使用Model列对两张表进行拼接。
2.流程分析
- 导入第一张表
- 对Price和ReleaseDate进行排序,价格升序,时间降序
- 对Model进行聚合分组,使得相同Model排在一起
- 选择价格最低,时间最新的一行数据
- 导入第二张表
- 合并两张表
3.代码实现
3.1 导入第一张表
import pandas as pd
data1 = pd.read_excel("file_path")
3.2 对Price和ReleaseDate进行排序,价格升序,时间降序
# 首先将ReleaseDate的字符串变为Datetime格式
# 如果日期不是字符串格式,可以先变为字符串
data1["ReleaseDate"] = data1["ReleaseDate"].astype(str)
data1["ReleaseDate"] = pd.to_datetime(data1["ReleaseDate"], format="yyyy-mm-dd") # pd.to_datetime(data, format)
# 进行排序
data_sorted = data1.sort_values(by=["Price", "ReleaseDate"], ascending=[True, False]) # 参数见下文
sort_values
参数说明
by
:指定用于排序的列名或列名列表。axis
:指定沿哪个轴排序,0表示按行排序(默认),1表示按列排序。ascending
:指定排序顺序,默认为True(升序)。可以设置为False进行降序排序,或传递一个布尔列表来对多个列指定不同的排序顺序。inplace
:如果设置为True,则在原地排序,而不创建新的DataFrame。kind
:指定排序算法,常见的有’quicksort’(默认)、‘mergesort’和’heapsort’。na_position
:指定缺失值在排序结果中的位置,可以是’first’或’last’(默认)。ignore_index
:如果设置为True,则结果的索引将被重置。
3.3 对Model分组排序,并取出每组第一行,即价格最低,时间最新的数据
data_new = data1.groupby(by="Model").first().reset_index()
# first()方法能够取出每个组中第一个非空行
# reset_index()方法是 Pandas 中用于重置 DataFrame 或 Series 索引的方法。它可以将索引重置为默认的整数索引,并将原来的索引列转换为普通列。
# 这里由于使用groupby后默认将被分组的列作为索引,所以需要使用reset_index将该列变为普通列,并重置索引为整数索引
# 如果想将时间还原回之前的格式,可以使用strftime方法,该方法用于将时间转化为字符串。用法为data.strftime("format")
data_new["ReleaseDate"] = data_new["ReleaseDate"].strftime("%Y.%m")
# reset_index后,作为索引的列会被放到第一列,如果想要恢复原来的列顺序,需要进行操作
data_column = list(data1.columns)
data_new = data_new[data_columns]
groupby
是 Pandas 中的一个强大工具,用于对数据进行分组,并对每个分组应用聚合函数。可以对数据进行聚合、变换和过滤等操作。
基本用法
import pandas as pd
# 创建一个示例DataFrame
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Values': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
# 按'Category'列进行分组,并计算每个分组的总和
grouped = df.groupby('Category').sum()
print(grouped)
输出
Values
Category
A 9
B 12
参数说明
by
:指定用于分组的列名或列名列表。axis
:指定沿哪个轴分组,0表示按行分组(默认),1表示按列分组。level
:在多层索引(MultiIndex)情况下,指定用于分组的级别。as_index
:如果为True(默认),分组的列将作为结果DataFrame的索引。如果为False,分组的列将保留为普通列。
常用操作
聚合函数
sum()
:计算总和mean()
:计算平均值count()
:计算非NA值的数量max()
:计算最大值min()
:计算最小值
# 计算每个分组的平均值
grouped_mean = df.groupby('Category').mean()
print(grouped_mean)
多列分组
# 创建一个示例DataFrame
data = {
'Category1': ['A', 'A', 'B', 'B'],
'Category2': ['C', 'D', 'C', 'D'],
'Values': [1, 2, 3, 4]
}
df = pd.DataFrame(data)
# 按'Category1'和'Category2'列进行分组,并计算每个分组的总和
grouped_multi = df.groupby(['Category1', 'Category2']).sum()
print(grouped_multi)
分组后的聚合
# 创建一个示例DataFrame
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Values': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
# 按'Category'列进行分组,并应用多个聚合函数
aggregated = df.groupby('Category')['Values'].agg(['sum', 'mean', 'count'])
print(aggregated)
结果
sum mean count
Category
A 9 3 3
B 12 4 3
分组后的过滤
# 创建一个示例DataFrame
data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Values': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
# 按'Category'列进行分组,并保留总和值大于10的分组
filtered = df.groupby('Category').filter(lambda x: x['Values'].sum() > 10)
print(filtered)
结果
Category Values
1 B 2
3 B 4
5 B 6
应用场景
- 数据聚合:对数据进行汇总统计,如计算总和、平均值等。
- 数据变换:对分组数据进行变换,如标准化、归一化等。
- 数据过滤:根据条件过滤分组数据。
3.4 导入另一张表
data2 = pd.read_excel("file_path")
3.5 合并两张表
data_end = pd.merge(data_new, data2, on="Model", how=outer)
# 如果想删除列,可以使用df.drop()
# 如果想给列重命名,可以使用df.rename(columns={old_name=new_name})
# 使用to_excel进行保存
data_end.to_excel("file_path", index=Flase) # index参数表示是否保存索引
pd.merge
是 Pandas 库中的一个函数,用于将两个 DataFrame 合并在一起,类似于 SQL 中的 JOIN 操作。它可以根据一个或多个键将数据合并在一起。
基本用法
import pandas as pd
# 创建两个示例DataFrame
df1 = pd.DataFrame({
'Key': ['A', 'B', 'C', 'D'],
'Value1': [1, 2, 3, 4]
})
df2 = pd.DataFrame({
'Key': ['B', 'D', 'E', 'F'],
'Value2': [5, 6, 7, 8]
})
# 按照'Key'列进行合并
merged_df = pd.merge(df1, df2, on='Key')
print(merged_df)
输出
Key Value1 Value2
0 B 2 5
1 D 4 6
参数说明
left
:左侧的 DataFrame。right
:右侧的 DataFrame。how
:合并的方式,有以下几种:left
:左连接,保留左侧 DataFrame 中的所有行。right
:右连接,保留右侧 DataFrame 中的所有行。outer
:外连接,保留两个 DataFrame 中的所有行。inner
:内连接,保留两个 DataFrame 中的共有行(默认)。
on
:用于连接的列名。必须在两个 DataFrame 中都存在。如果没有指定,默认会使用两个 DataFrame 中的列的交集。left_on
:左侧 DataFrame 中用于连接的列名。right_on
:右侧 DataFrame 中用于连接的列名。left_index
:使用左侧 DataFrame 的索引作为连接键。right_index
:使用右侧 DataFrame 的索引作为连接键。suffixes
:当左右 DataFrame 有相同列名时,添加后缀以区分这些列,默认值为('_x', '_y')
。sort
:按连接键对结果进行排序,默认为False
。
示例
左连接(left
)
left_join = pd.merge(df1, df2, on='Key', how='left')
print(left_join)
输出
Key Value1 Value2
0 A 1 NaN
1 B 2 5.0
2 C 3 NaN
3 D 4 6.0
右连接(right
)
right_join = pd.merge(df1, df2, on='Key', how='right')
print(right_join)
输出
Key Value1 Value2
0 B 2.0 5
1 D 4.0 6
2 E NaN 7
3 F NaN 8
外连接(outer
)
outer_join = pd.merge(df1, df2, on='Key', how='outer')
print(outer_join)
输出
Key Value1 Value2
0 A 1.0 NaN
1 B 2.0 5.0
2 C 3.0 NaN
3 D 4.0 6.0
4 E NaN 7.0
5 F NaN 8.0
使用不同的列名进行连接
df3 = pd.DataFrame({
'Key1': ['A', 'B', 'C', 'D'],
'Value1': [1, 2, 3, 4]
})
df4 = pd.DataFrame({
'Key2': ['B', 'D', 'E', 'F'],
'Value2': [5, 6, 7, 8]
})
# 使用不同的列名进行连接
merged_df_different_keys = pd.merge(df3, df4, left_on='Key1', right_on='Key2', how='inner')
print(merged_df_different_keys)
输出
Key1 Value1 Key2 Value2
0 B 2 B 5
1 D 4 D 6
使用索引进行连接
df5 = pd.DataFrame({
'Value1': [1, 2, 3, 4]
}, index=['A', 'B', 'C', 'D'])
df6 = pd.DataFrame({
'Value2': [5, 6, 7, 8]
}, index=['B', 'D', 'E', 'F'])
# 使用索引进行连接
merged_df_index = pd.merge(df5, df6, left_index=True, right_index=True, how='inner')
print(merged_df_index)
输出
Value1 Value2
B 2 5
D 4 6
4. 总结
通过以上操作,就可以对表格进行排序和筛选,最终合并两张表格。groupby
函数和merge
函数是类似操作中最重要的部分,需要重点掌握。