
在数据处理中,我们经常需要根据复杂的业务逻辑更新dataframe中的数据。一个常见的场景是,我们需要在一个dataframe中,基于某些列进行分组(例如,按first name和last name),然后查找组内特定类型(例如type为'gca')的值,并将其赋值给组内另一特定类型(例如type为'ca')的行。
考虑以下示例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)原始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
我们的目标是:对于每个由First Name和Last Name定义的分组,如果存在Type为'CA'的行和Type为'GCA'的行,则将该分组中所有Type为'CA'的行的Value列更新为该分组中Type为'GCA'的行的Value。 例如,对于Alice Johnson这个分组,Type为'CA'的行的Value(25)应该被更新为Type为'GCA'的行的Value(40)。
解决此问题的一种高效方法是利用Pandas的索引和条件选择能力。核心思路是首先构建一个映射,将分组键(First Name, Last Name)映射到目标值('GCA'的Value),然后使用这个映射来更新Type为'CA'的行。
首先,我们需要从DataFrame中筛选出所有Type为'GCA'的行,并将其Value作为参考值。为了方便后续查找,我们可以将First Name和Last Name设置为复合索引,创建一个Series。
# 复制原始DataFrame,避免直接修改
updated_df = df.copy()
# 提取Type为'GCA'的行的Value,并以(First Name, Last Name)作为索引
gca_values = updated_df[updated_df['Type'] == 'GCA'].set_index(['First Name', 'Last Name'])['Value']
print("\nGCA值映射 (gca_values Series):")
print(gca_values)GCA值映射:
First Name Last Name Alice Johnson 40 Name: Value, dtype: int64
这里,gca_values现在是一个Series,它的索引是('Alice', 'Johnson'),对应的值是40。
接下来,我们需要找到所有Type为'CA'的行,并使用gca_values来更新它们的Value。Pandas的.loc结合.apply和Series的.get()方法可以优雅地实现这一点。
# 定位Type为'CA'的行,并使用apply结合gca_values进行赋值
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:
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'的行。
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)
# 复制DataFrame以进行操作
updated_df = df.copy()
# 1. 提取Type为'GCA'的行的Value,并以(First Name, Last Name)作为索引
# 这样可以快速通过姓名组合查找对应的GCA值
gca_values = updated_df[updated_df['Type'] == 'GCA'].set_index(['First Name', 'Last Name'])['Value']
print("\n--- GCA值映射 (gca_values Series) ---")
print(gca_values)
# 2. 定位Type为'CA'的行,并使用apply结合gca_values进行赋值
# lambda函数会为每一行CA类型数据查找其对应的GCA值
# .get()方法的第二个参数确保如果找不到GCA值,则保留原始CA值
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)通过本教程,我们学习了如何在Pandas DataFrame中,根据复杂的分组条件和类型过滤,高效地实现值的条件赋值。这种方法利用了Pandas强大的索引和查找功能,能够清晰地表达业务逻辑,并处理了可能出现的缺失参考值的情况。掌握这种技术对于处理结构化数据中的复杂更新任务至关重要。
以上就是Pandas DataFrame:基于分组条件更新特定类型行的值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号