Pandas筛选、去重与数据合并

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

应用场景

  1. 数据聚合:对数据进行汇总统计,如计算总和、平均值等。
  2. 数据变换:对分组数据进行变换,如标准化、归一化等。
  3. 数据过滤:根据条件过滤分组数据。

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函数是类似操作中最重要的部分,需要重点掌握。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书江南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值