如何正确循环Pandas DataFrame创建新列?循环后未生成pl_stop列的问题排查
问题诊断与解决思路
你这段代码的核心问题在于错误地使用了.all()方法,导致条件判断完全不符合预期,所以pl_stop列根本没被创建。咱们一步步拆解问题:
1. 为什么原代码不生效?
你在循环里写的条件:
if res_d['entry'].all() != False and res_d['take_profit'].all() == False and res_d['stop_loss'].all() != False:
这里的.all()是对整列所有元素进行判断,只有当列里每一个值都满足条件时才返回True。但你的DataFrame里:
entry列最后一行是False,所以res_d['entry'].all()直接返回Falsetake_profit列有两个非False的值(第三、四行),所以res_d['take_profit'].all()也返回False- 前面两个条件已经不满足,整个if语句永远不会执行,自然不会创建
pl_stop列。
另外,你用iterrows()逐行循环的方式也没必要,Pandas推荐用向量化操作替代逐行循环,效率和可读性都更高。
2. 正确的实现方式
我们需要逐行判断:当某一行的entry不是False、take_profit是False、stop_loss不是False时,计算stop_loss - entry作为pl_stop的值,其他情况可以设为False或NaN。
方法一:向量化条件判断(推荐)
直接用布尔索引赋值,不需要循环:
import pandas as pd # 构造示例DataFrame(模拟你的res_d) data = { 'time': ['2022-04-05', '2022-04-06', '2022-04-07', '2022-04-08', '2022-04-09'], 'entry': [3881.5, 3835.5, 3767.0, 3781.5, False], 'take_profit': [False, False, 3785.5, 3793.5, False], 'stop_loss': [3854.5, 3816.5, False, False, False] } res_d = pd.DataFrame(data).fillna(False) # 初始化pl_stop列 res_d['pl_stop'] = False # 筛选符合条件的行并计算赋值 mask = (res_d['entry'] != False) & (res_d['take_profit'] == False) & (res_d['stop_loss'] != False) res_d.loc[mask, 'pl_stop'] = res_d.loc[mask, 'stop_loss'] - res_d.loc[mask, 'entry']
运行后得到的结果:
| time | entry | take_profit | stop_loss | pl_stop |
|---|---|---|---|---|
| 2022-04-05 | 3881.5 | False | 3854.5 | -27.0 |
| 2022-04-06 | 3835.5 | False | 3816.5 | -19.0 |
| 2022-04-07 | 3767.0 | 3785.5 | False | False |
| 2022-04-08 | 3781.5 | 3793.5 | False | False |
| 2022-04-09 | False | False | False | False |
方法二:如果一定要用循环(不推荐,效率低)
如果你坚持用iterrows(),需要把条件改成针对当前行的判断,而非整列:
res_d['pl_stop'] = False for index, row in res_d.iterrows(): if row['entry'] != False and row['take_profit'] == False and row['stop_loss'] != False: res_d.loc[index, 'pl_stop'] = row['stop_loss'] - row['entry']
这个也能得到同样结果,但对于大体积的DataFrame,向量化操作的速度会快很多。
3. 额外建议
- 尽量避免在Pandas中用逐行循环,向量化操作是Pandas的核心优势,效率和可读性都更优。
- 如果你的
False实际代表缺失值,建议用NaN来表示,这样可以用pd.isna()来判断,逻辑会更清晰。
内容的提问来源于stack exchange,提问作者Pren Ven
相关产品推荐
相关产品推荐

