Python 应用于数据帧的条件If语句

Python 应用于数据帧的条件If语句,python,pandas,if-statement,Python,Pandas,If Statement,我试图以pythonic的方式(即没有循环)通过数据帧进行迭代,以便根据是否满足条件创建新列。特别是,给定一个每日收益的数据框架,我想创建一个新列,告诉我是否越过了上限或下限(限额是对称的,但股票是特定的,因此每行可能有一个不同的限额,在下面的df中称为std),类似这样: import pandas as pd dict = [ {'ticker':'jpm','date': '2016-11-28','returns': '0.2','returns2': '0.3','st

我试图以pythonic的方式(即没有循环)通过数据帧进行迭代,以便根据是否满足条件创建新列。特别是,给定一个每日收益的数据框架,我想创建一个新列,告诉我是否越过了上限或下限(限额是对称的,但股票是特定的,因此每行可能有一个不同的限额,在下面的df中称为std),类似这样:

import pandas as pd
dict = [
        {'ticker':'jpm','date': '2016-11-28','returns': '0.2','returns2': '0.3','std': '0.1'},
{ 'ticker':'ge','date': '2016-11-28','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'fb', 'date': '2016-11-28','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'aapl', 'date': '2016-11-28','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'msft','date': '2016-11-28','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'amzn','date': '2016-11-28','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'jpm','date': '2016-11-29','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'ge', 'date': '2016-11-29','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'fb','date': '2016-11-29','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'aapl','date': '2016-11-29','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'msft','date': '2016-11-29','returns': '0.2','returns2': '0.3','std': '0.1'},
{'ticker':'amzn','date': '2016-11-29','returns': '0.2','returns2': '0.3','std': '0.1'}
]
df = pd.DataFrame(dict)
df['date']      = pd.to_datetime(df1['date'])
df=df.set_index(['date','ticker'], drop=True)  
这应该被转换,这样我就得到了一个新的列,其中包含了各自当天的回报,如果超过了上/下阈值,如果没有超过,它应该只包含最后一天的回报(因此返回2)

我试图保持这种灵活性(这样它就可以处理多于2个返回列)和高效性(这样它就可以处理非常大的dfs)


有人能推荐一种方法吗?

我会使用
numpy

dict1 = [
        {'ticker':'jpm','date': '2016-11-28','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{ 'ticker':'ge','date': '2016-11-28','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'fb', 'date': '2016-11-28','returns': '0.05','returns2': '-0.3','std': '0.1','sl': '-0.3'},
{'ticker':'aapl', 'date': '2016-11-28','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'msft','date': '2016-11-28','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'amzn','date': '2016-11-28','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'jpm','date': '2016-11-29','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'ge', 'date': '2016-11-29','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'fb','date': '2016-11-29','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'aapl','date': '2016-11-29','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'msft','date': '2016-11-29','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'amzn','date': '2016-11-29','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'}
]
df = pd.DataFrame(dict1)
df['date']      = pd.to_datetime(df['date'])
df=df.set_index(['date','ticker'], drop=True)

ret1 = pd.to_numeric(df.returns).values
ret2 =  pd.to_numeric(df.returns2).values
std =  pd.to_numeric(df['std']).values

mask = np.abs(ret1) >= std
out = mask*ret1 + (1-mask)*ret2
print(out)
# prints [ 0.2 -0.2 -0.3 -0.2  0.2 -0.2  0.2 -0.2  0.2 -0.2  0.2 -0.2]

#then just add the column to df:
df['my_out'] = pd.DataFrame(out, index=df.index)

我会使用
numpy

dict1 = [
        {'ticker':'jpm','date': '2016-11-28','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{ 'ticker':'ge','date': '2016-11-28','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'fb', 'date': '2016-11-28','returns': '0.05','returns2': '-0.3','std': '0.1','sl': '-0.3'},
{'ticker':'aapl', 'date': '2016-11-28','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'msft','date': '2016-11-28','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'amzn','date': '2016-11-28','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'jpm','date': '2016-11-29','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'ge', 'date': '2016-11-29','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'fb','date': '2016-11-29','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'aapl','date': '2016-11-29','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'},
{'ticker':'msft','date': '2016-11-29','returns': '0.2','returns2': '-0.3','std': '0.1','sl': '0.2'},
{'ticker':'amzn','date': '2016-11-29','returns': '-0.2','returns2': '0.3','std': '0.1','sl': '-0.2'}
]
df = pd.DataFrame(dict1)
df['date']      = pd.to_datetime(df['date'])
df=df.set_index(['date','ticker'], drop=True)

ret1 = pd.to_numeric(df.returns).values
ret2 =  pd.to_numeric(df.returns2).values
std =  pd.to_numeric(df['std']).values

mask = np.abs(ret1) >= std
out = mask*ret1 + (1-mask)*ret2
print(out)
# prints [ 0.2 -0.2 -0.3 -0.2  0.2 -0.2  0.2 -0.2  0.2 -0.2  0.2 -0.2]

#then just add the column to df:
df['my_out'] = pd.DataFrame(out, index=df.index)
正在处理df2

# Make columns numeric
df2[["returns", "returns2", "std"]] = df2[["returns", "returns2", "std"]].astype(float)

# Create new column using returns2 (we'll overwrite it in . moment)
df2["output"] = df2["returns2"]
# Mask whether returns crosses std
m = df2["returns"].abs() > df2["std"]
# Overwrite that mask onto new column
df2.loc[m, "output"] = df2.loc[m, "returns"]
如果您想将其扩展到2个以上的列,那么我们需要了解选择哪一列的标准,但过程是相同的:您构建一个符合标准的掩码,然后应用它。

处理df2

# Make columns numeric
df2[["returns", "returns2", "std"]] = df2[["returns", "returns2", "std"]].astype(float)

# Create new column using returns2 (we'll overwrite it in . moment)
df2["output"] = df2["returns2"]
# Mask whether returns crosses std
m = df2["returns"].abs() > df2["std"]
# Overwrite that mask onto new column
df2.loc[m, "output"] = df2.loc[m, "returns"]

如果您想将其扩展到两列以上,那么我们需要了解选择哪一列的标准,但过程是相同的:您构建一个符合标准的掩码,然后应用它。

dict
是一种内置数据类型,称之为else@Tartaglia显示具有预期结果的几行,您可以在df2中再次使用普通列?什么是“sl”?
dict
是一种内置数据类型,称之为else@Tartaglia显示几行预期结果您能在df2中再次解释这些列吗?什么是“sl”?感谢您的回答,我仍在处理此问题…将向您汇报谢谢您的回答,我仍在处理此问题…将谢谢你的回答,我还在做这个…会回来的谢谢你的回答,我还在做这个…会回来的