
在数据处理中,我们经常需要根据DataFrame中多列的组合条件来生成一个新的列。例如,根据“名”和“姓”的存在情况来判断一个姓氏是否缺失。最初的尝试可能倾向于使用列表推导式,因为它简洁高效。然而,在处理多个序列的迭代时,常见的语法错误可能会出现。
考虑以下场景:我们有一个names_df DataFrame,包含'Name Entry 1'和'Name Entry 2'两列,我们希望根据这两列的值来生成'Surname'列。一个常见的错误尝试是直接在列表推导式中用逗号分隔多个序列:
# 假设 names_df 已经定义
# names_df = pd.DataFrame({
# 'Name Entry 1': ['John', '', 'Jane', 'Peter'],
# 'Name Entry 2': ['Doe', '', 'Smith', 'Jones']
# })
# 错误的尝试:直接使用逗号分隔多个Series
# names_df['Surname'] = [
# 'MISSING' if i != '' and j == '' else j
# for i, j in names_df['Name Entry 1'], names_df['Name Entry 2']
# ]
# 这会导致 SyntaxError上述代码会抛出SyntaxError,因为它试图将两个独立的Series对象(names_df['Name Entry 1']和names_df['Name Entry 2'])同时解包到i和j中,这不符合Python列表推导式的迭代语法。
要正确地在列表推导式中同时迭代多个序列,需要使用Python内置的zip()函数。zip()函数可以将多个可迭代对象打包成一个元组的迭代器,每个元组包含来自每个可迭代对象的对应元素。
将错误的逗号替换为zip()函数,即可解决语法问题:
import pandas as pd
# 示例 DataFrame
names_df = pd.DataFrame({
'Name Entry 1': ['John', '', 'Jane', 'Peter', 'Emily'],
'Name Entry 2': ['Doe', '', 'Smith', 'Jones', '']
})
# 正确的列表推导式,使用 zip 函数
names_df['Surname'] = [
'MISSING' if i != '' and j == '' else j
for i, j in zip(names_df['Name Entry 1'], names_df['Name Entry 2'])
]
print("使用 zip 的列表推导式结果:")
print(names_df)输出示例:
使用 zip 的列表推导式结果: Name Entry 1 Name Entry 2 Surname 0 John Doe Doe 1 MISSING MISSING 2 Jane Smith Smith 3 Peter Jones Jones 4 Emily MISSING
注意事项:
当需要处理更复杂的、包含多个if/elif/else分支的条件逻辑时,将所有逻辑塞进一个列表推导式会变得非常难以阅读和维护。在这种情况下,Pandas的apply()方法结合自定义函数是更推荐的方案。
apply()方法可以沿着DataFrame的轴(行或列)应用一个函数。当我们需要基于一行中多个列的值来计算新列时,应将axis=1传递给apply(),表示函数将逐行应用,并且函数的输入将是该行的一个Series对象。
以下是使用apply方法处理相同逻辑的示例:
import pandas as pd
# 示例 DataFrame (与上面相同)
names_df = pd.DataFrame({
'Name Entry 1': ['John', '', 'Jane', 'Peter', 'Emily'],
'Name Entry 2': ['Doe', '', 'Smith', 'Jones', '']
})
def determine_surname(row):
"""
根据 'Name Entry 1' 和 'Name Entry 2' 列的值确定 'Surname'。
"""
if row['Name Entry 1'] != '' and row['Name Entry 2'] == '':
return 'MISSING'
# 可以根据需要添加更多条件,例如:
# elif row['Name Entry 1'] == '' and row['Name Entry 2'] != '':
# return row['Name Entry 2'] + '_Only'
# elif row['Name Entry 1'] != '' and row['Name Entry 2'] != '':
# return row['Name Entry 2']
else:
return row['Name Entry 2']
# 将自定义函数应用到 DataFrame 的每一行
names_df['Surname_Apply'] = names_df.apply(determine_surname, axis=1)
print("\n使用 apply 方法的结果:")
print(names_df)输出示例:
使用 apply 方法的结果: Name Entry 1 Name Entry 2 Surname Surname_Apply 0 John Doe Doe Doe 1 MISSING MISSING 2 Jane Smith Smith Smith 3 Peter Jones Jones Jones 4 Emily MISSING MISSING
apply方法的优势:
注意事项:
在Pandas中基于多列条件创建新列时,选择合适的方法至关重要:
理解这两种方法的适用场景和优缺点,能够帮助开发者编写更健壮、更易于维护的Pandas数据处理代码。在实际应用中,应根据具体的需求(逻辑复杂度、数据量大小等)权衡选择最合适的实现方式。
以上就是Pandas多列条件逻辑处理:高效创建新列的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号