python - 条件 If 语句应用于数据帧的多列

标签 python pandas dataframe

我有一个分钟股票 yield 的数据框,我想创建一个新列,以是否超出 yield (正数或负数)为条件,如果是,则该行等于限制(正数或负数) ,否则等于检查的最后一列。下面的例子说明了这一点:

import pandas as pd
dict = [
        {'ticker':'jpm','date': '2016-11-28','returns1': 0.02,'returns2': 0.03,'limit': 0.1},
{ 'ticker':'ge','date': '2016-11-28','returns1': 0.2,'returns2': -0.3,'limit': 0.1},
{'ticker':'fb', 'date': '2016-11-28','returns1': -0.2,'returns2': 0.5,'limit': 0.1},
]
df = pd.DataFrame(dict)
df['date']      = pd.to_datetime(df['date'])
df=df.set_index(['date','ticker'], drop=True)  

目标是这样的:

                   fin_return  limit  returns1  returns2
date       ticker                                       
2016-11-28 jpm           0.03    0.1      0.02      0.03
           ge            0.10    0.1      0.20     -0.30
           fb           -0.10    0.1     -0.20      0.50

因此,在第一行中,返回值从未超出限制,因此该值等于 returns2 中的值 (0.03)。在第 2 行中,返回超出了上行范围,因此该值应该是正限值。在第 3 行中,返回率首先在下行方向上超出,因此该值应该是负限制。

我的实际数据框有几千列,所以我不太确定如何做到这一点(也许是一个循环?)。我很感激任何建议。

这个想法是测试止损或限价交易算法。每当触发下限时,它应该用下限替换最后一列,上限也相同,以该行的先到者为准。因此,一旦触发其中一个,就应该测试下一行。

我在此处添加了一个不同的示例,其中又包含一列,以使这一点更加清晰(限制为 +/- 0.1)

                   fin_return  limit  returns1  returns2 returns3
date       ticker                                       
2016-11-28 jpm           0.02    0.1      0.01      0.04    0.02
           ge            0.10    0.1      0.20     -0.30    0.6
           fb           -0.10    0.1     -0.02     -0.20    0.7

在第一行中,从未触发最终返回的限制是来自 returns3 (0.02)。在第 2 行中,returns 1 的上限被触发,因此 fin_return 等于上限(returns2 和 returns 3 中发生的任何情况与该行无关)。在第 3 行中,returns 2 的下行超出了限制,因此 fin_return 变为 -0.1,并且 returns3 中的任何内容都无关紧要。

最佳答案

用途:

dict = [
        {'ticker':'jpm','date': '2016-11-28','returns1': 0.02,'returns2': 0.03,'limit': 0.1,'returns3':0.02},
{ 'ticker':'ge','date': '2016-11-28','returns1': 0.2,'returns2': -0.3,'limit': 0.1,'returns3':0.6},
{'ticker':'fb', 'date': '2016-11-28','returns1': -0.02,'returns2': -0.2,'limit': 0.1,'returns3':0.7},
]
df = pd.DataFrame(dict)
df['date']      = pd.to_datetime(df['date'])
df=df.set_index(['date','ticker'], drop=True)  
<小时/>
#select all columns without first (here limit column)
df1 = df.iloc[:, 1:]

#comapre if all columns under +-limit
mask = df1.lt(df['limit'], axis=0) & df1.gt(-df['limit'], axis=0) 
m1 = mask.all(axis=1)
print (m1)
date        ticker
2016-11-28  jpm        True
            ge        False
            fb        False
dtype: bool

#replace first columns in limit with NaNs and back filling missing values, seelct first col
m2 = df1.mask(mask).bfill(axis=1).iloc[:, 0].gt(df['limit'])
print (m2)
date        ticker
2016-11-28  jpm       False
            ge         True
            fb        False
dtype: bool

arr = np.select([m1,m2, ~m2], [df1.iloc[:, -1], df['limit'], -df['limit']])
#set first column in DataFrame by insert
df.insert(0, 'fin_return', arr)
print (df)
                   fin_return  limit  returns1  returns2  returns3
date       ticker                                                 
2016-11-28 jpm           0.02    0.1      0.02      0.03      0.02
           ge            0.10    0.1      0.20     -0.30      0.60
           fb           -0.10    0.1     -0.02     -0.20      0.70

关于python - 条件 If 语句应用于数据帧的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56765781/

相关文章:

python - 使用 matplotlib 绘制 netCDF 数据的奇怪图

python - 每隔几分钟在 linux 机器上运行一个 python 脚本,前提是它还没有运行

python - 从列表中选择数据,同时保持顺序

python-3.x - 如何绘制连接条形图顶部的线

python gnuplot 从文件中读取

python - 虚拟变量python的数据操作

python - 如何在Python中使用pandas编写数据数组以在行而不是列中表现出色

按列中的名称对 pandas DataFrame 中的数据进行排序

r - 基于 R 中 2 个独立数据帧的值创建新数据帧的有效方法

python - 如何使用 python2.7 使用嵌套 for 循环迭代数据帧并附加到新的数据帧列?