
在数据分析和处理中,我们经常会遇到需要根据dataframe中特定分组的条件来更新其他行数据的情况。例如,在一个包含用户交易记录的dataframe中,我们可能需要根据某个用户的特定交易类型(如“最终确认”)来更新其另一交易类型(如“待确认”)的值。这种操作要求我们首先识别出分组内的参考值,然后将这些参考值应用到同组内的目标行上。
考虑以下示例数据,其中包含姓名、类型和对应的值:
import pandas as pd
data = {
'First Name': ['Alice', 'Alice', 'Alice', 'Alice', 'Bob'],
'Last Name': ['Johnson', 'Johnson', 'Johnson', 'Johnson', 'Jack'],
'Type': ['CA', 'DA', 'FA', 'GCA', 'CA'],
'Value': [25, 30, 35, 40, 50]
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)我们的目标是:对于每个由 First Name 和 Last Name 组成的分组,如果存在 Type 为 'GCA' 的行,则将其 Value 赋给同组中 Type 为 'CA' 的行。以上述数据为例,对于 Alice Johnson 组,Type 为 'GCA' 的 Value 是 40。因此,Type 为 'CA' 的 Alice Johnson 行的 Value 应该从 25 更新为 40。
为了实现上述目标,我们将采用一种结合索引查找和条件应用的方法。这种方法既高效又易于理解。
首先,确保我们有一个Pandas DataFrame,这是所有操作的基础。我们将使用原始数据创建DataFrame并创建一个副本进行操作,以保留原始数据。
import pandas as pd
data = {
'First Name': ['Alice', 'Alice', 'Alice', 'Alice', 'Bob'],
'Last Name': ['Johnson', 'Johnson', 'Johnson', 'Johnson', 'Jack'],
'Type': ['CA', 'DA', 'FA', 'GCA', 'CA'],
'Value': [25, 30, 35, 40, 50]
}
df = pd.DataFrame(data)
updated_df = df.copy() # 创建一个副本进行操作核心思想是首先提取出所有需要作为参考的值。在本例中,我们需要提取 Type 为 'GCA' 的行的 Value,并将其与对应的 First Name 和 Last Name 关联起来,以便后续快速查找。
我们可以通过筛选 Type == 'GCA' 的行,然后使用 set_index 将 First Name 和 Last Name 设置为复合索引,最后选择 Value 列来创建一个Series。这个Series的索引将是 (First Name, Last Name) 元组,值则是对应的 GCA 值。
gca_values = updated_df[updated_df['Type'] == 'GCA'].set_index(['First Name', 'Last Name'])['Value']
print("\n提取的 GCA 参考值:")
print(gca_values)输出将是:
提取的 GCA 参考值: First Name Last Name Alice Johnson 40 Name: Value, dtype: int64
这里,Bob Jack 组没有 Type 为 'GCA' 的行,所以它不会出现在 gca_values 中。
接下来,我们需要找到所有 Type 为 'CA' 的行,并根据其 First Name 和 Last Name 从 gca_values 中查找对应的值进行更新。
我们使用 updated_df.loc 来选择 Type == 'CA' 的行。然后,对这些选定的行的 Value 列进行赋值。赋值操作通过 apply 函数结合 lambda 表达式实现。对于每一行,lambda 函数会尝试从 gca_values 中获取对应 (First Name, Last Name) 的值。
gca_values.get((row['First Name'], row['Last Name']), row['Value']) 这一部分非常关键:
updated_df.loc[df['Type'] == 'CA', 'Value'] = updated_df[updated_df['Type'] == 'CA'].apply(
lambda row: gca_values.get((row['First Name'], row['Last Name']), row['Value']), axis=1
)将上述步骤整合,形成完整的解决方案:
import pandas as pd
# 原始数据
data = {
'First Name': ['Alice', 'Alice', 'Alice', 'Alice', 'Bob'],
'Last Name': ['Johnson', 'Johnson', 'Johnson', 'Johnson', 'Jack'],
'Type': ['CA', 'DA', 'FA', 'GCA', 'CA'],
'Value': [25, 30, 35, 40, 50]
}
df = pd.DataFrame(data)
updated_df = df.copy() # 创建副本进行操作
print("原始 DataFrame:")
print(df)
# 步骤二:提取分组参考值
# 筛选出 Type 为 'GCA' 的行,并以 'First Name' 和 'Last Name' 为索引创建 Series
gca_values = updated_df[updated_df['Type'] == 'GCA'].set_index(['First Name', 'Last Name'])['Value']
print("\n提取的 GCA 参考值 (Series):")
print(gca_values)
# 步骤三:应用条件更新
# 筛选出 Type 为 'CA' 的行,并对其 'Value' 列进行更新
# 使用 apply 和 lambda 函数,通过 gca_values.get() 安全地获取 GCA 值
updated_df.loc[df['Type'] == 'CA', 'Value'] = updated_df[updated_df['Type'] == 'CA'].apply(
lambda row: gca_values.get((row['First Name'], row['Last Name']), row['Value']), axis=1
)
print("\n更新后的 DataFrame:")
print(updated_df)运行上述代码,我们将得到如下更新后的DataFrame:
原始 DataFrame: First Name Last Name Type Value 0 Alice Johnson CA 25 1 Alice Johnson DA 30 2 Alice Johnson FA 35 3 Alice Johnson GCA 40 4 Bob Jack CA 50 提取的 GCA 参考值 (Series): First Name Last Name Alice Johnson 40 Name: Value, dtype: int64 更新后的 DataFrame: First Name Last Name Type Value 0 Alice Johnson CA 40 1 Alice Johnson DA 30 2 Alice Johnson FA 35 3 Alice Johnson GCA 40 4 Bob Jack CA 50
可以看到,Alice Johnson 组中 Type 为 'CA' 的行的 Value 已成功从 25 更新为 40。而 Bob Jack 组中 Type 为 'CA' 的行的 Value 保持 50 不变,因为该组没有 Type 为 'GCA' 的参考值。
本教程详细介绍了如何在Pandas DataFrame中,根据分组内的特定条件更新数据。通过构建一个以分组键为索引的参考值Series,并结合 loc 和 apply 进行条件查找和赋值,我们能够高效且安全地完成复杂的条件更新任务。这种方法在数据清洗、特征工程以及各种需要基于上下文信息进行数据转换的场景中都非常实用。理解并掌握 set_index、loc 和 apply 等Pandas核心功能,对于进行高效的数据操作至关重要。
以上就是Pandas数据处理:基于分组条件更新DataFrame值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号