Python 2.7 数据帧中的列表理解

Python 2.7 数据帧中的列表理解,python-2.7,pandas,dataframe,Python 2.7,Pandas,Dataframe,如果满足某些条件,我想在第二天开盘时提取当前存储在(第+1行)中的价格,并将其存储在新列中 df['b']='' df['shift']='' df['shift']=df['open'].shift(-1) df['b']=df[x for x in df['shift'] if df["MA10"]>df["MA100"]] 有几种方法。使用应用: >>> df = pd.read_csv("bondstack.csv") >>> df["s

如果满足某些条件,我想在第二天开盘时提取当前存储在(第+1行)中的价格,并将其存储在新列中

df['b']=''

df['shift']=''

df['shift']=df['open'].shift(-1)

df['b']=df[x for x in df['shift'] if df["MA10"]>df["MA100"]]

有几种方法。使用
应用

>>> df = pd.read_csv("bondstack.csv")
>>> df["shift"] = df["open"].shift(-1)
>>> df["b"] = df.apply(lambda row: row["shift"] if row["MA10"] > row["MA100"] else np.nan, axis=1)
产生

>>> df[["MA10", "MA100", "shift", "b"]][:10]
        MA10      MA100      shift          b
0  16.915625  17.405625  16.734375        NaN
1  16.871875  17.358750  17.171875        NaN
2  16.893750  17.317187  17.359375        NaN
3  16.950000  17.279062  17.359375        NaN
4  17.137500  17.254062  18.640625        NaN
5  17.365625  17.229063  18.921875  18.921875
6  17.550000  17.200312  18.296875  18.296875
7  17.681250  17.177500  18.640625  18.640625
8  17.812500  17.159375  18.609375  18.609375
9  17.943750  17.142813  18.234375  18.234375
对于更矢量化的方法,您可以使用

>>> df = pd.read_csv("bondstack.csv")
>>> df["b"] = np.nan
>>> df["b"][df["MA10"] > df["MA100"]] = df["open"].shift(-1)
或者我喜欢的方法:

>>> df = pd.read_csv("bondstack.csv")
>>> df["b"] = df["open"].shift(-1).where(df["MA10"] > df["MA100"])

修改DSM的方法3,在
np中说明真/假值。其中
明确:

#numpy.where(condition, x, y)
df["b"] = np.where(df["MA10"] > df["MA100"], df["open"].shift(-1), np.nan)
明确使用列表理解:

#[xv if c else yv for (c,xv,yv) in zip(condition,x,y)]      #np.where documentation
df['b'] = [ xv if c else np.nan for (c,xv) in zip(df["MA10"]> df["MA100"], df["open"].shift(-1))]

如果你想使用列表理解的结果作为索引,你应该使用:
df[[x代表x在df['shift']中如果df[“MA10”]>df[“MA100”]]]
,但我认为这会引起一些例外。请发布您的样本数据和期望的结果。@HYRY谢谢您的评论。我发布了一个指向我的样本数据的链接。我在发布之前使用了您的建议,并得到了我提到的错误“无效语法”。@user1374969:计算HYRY建议中的括号数,然后计算您建议中的括号数。@DSM谢谢。如果使用HYRY,我会收到ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()python不知道这是按位比较还是整列比较。这就是HYRY所说的“引发一些异常”。你的尝试既有语法问题,也有界面问题。我无法告诉你我有多感激(在这个网站上)你深思熟虑的建议和多种方式来看待同一个问题。谢谢。对于方法#3,我得到的时间序列对象没有属性“where”,因为where是一个numpy属性,我使用了np.where(),但有相同的错误。您知道发生了什么吗?您使用的是哪个版本的
pandas
?我使用的是0.10.1,上面的代码在您的数据上运行得很好。好的,是的,我认为它运行的是版本“0.9.1”。使用df['open'].shift(-1),我试图从满足'where'中条件的位置提取下一行的值(I+1)。也就是说,在满足“where”中定义的条件的行中,将其称为I,df[“b”]应在观察到该条件后的下一个I+1上将值存储在df[“open”]中。(现在,它似乎存储了从文件的最开始处移动的从--1开始的df['open']值)。似乎简单的df[“open”][i+1]不会起作用。我不确定我是否遵循了。调用条件M。如果您有[Monday open=1,M=True;周二open=2,M=False;周三open=3,M=True],您希望周一的b值是2还是3?星期二的b值应该是多少?