如何在Pandas DataFrame的assign方法中使用if条件语句
简介及可复现代码片段
我在对若干列执行需要通过if/else语句判断条件的操作时遇到了困难。
具体来说,我尝试在Pandas DataFrame的assign方法中完成该条件判断。以下是我尝试实现的示例代码:
# 导入Pandas import pandas as pd # 创建模拟数据 my_df = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10], 'col2':[11,22,33,44,55,66,77,88,99,1010]}) # 创建不覆盖原DataFrame的输出DataFrame out_df = my_df.assign( # 使用lambda函数成功创建新列col3 col3=lambda row: row['col1'] + row['col2'], # 使用新的lambda函数基于刚生成的列执行操作 bleep_bloop=lambda row: 'bleep' if (row['col3']%8 == 0) else 'bloop')
上述代码触发了ValueError:
ValueError: The truth value of a Series is ambiguous
排查错误时发现lambda函数在DataFrame中处理条件逻辑时表现不佳,主要原因是DataFrame以Series形式处理数据。
几种临时解决方案
使用apply
一种临时方案是先通过assign方法创建col3,再用apply方法创建bleep_bloop列:
out_sr = (my_df.assign( col3=lambda row: row['col1'] + row['col2']) .apply(lambda row: 'bleep' if (row['col3']%8 == 0) else 'bloop', axis=1))
但该方案仅返回包含bleep_bloop列结果的Series,而非同时包含col3和bleep_bloop的新DataFrame。
即时链式命令vs多命令拆分
另一种方案是将命令拆分为两步:
out_df_2 = (my_df.assign(col3=lambda row: row['col1'] + row['col2'])) out_df_2['bleep_bloop'] = out_df_2.apply(lambda row: 'bleep' if (row['col3']%8 == 0) else 'bloop', axis=1)
该方案可行,但我希望尽可能使用单一链式命令完成操作。
回到核心问题
鉴于上述方案不够理想,是否存在其他方法可基于if/else条件语句创建新列?
本文示例较为简单,但实际场景可能需要应用自定义函数(例如:out_df=my_df.assign(new_col=lambda row: my_func(row)),其中my_func是使用同一行中多列作为输入的复杂函数)。
内容的提问来源于stack exchange,提问作者Felipe D.
相关产品推荐
相关产品推荐

