【问题标题】:Pandas list comprehension in a dataframe数据框中的熊猫列表理解
【发布时间】:2013-04-03 02:50:44
【问题描述】:

如果满足某些条件,我想提取当前存储在 (row + 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[[x for x in df['shift'] if df["MA10"]>df["MA100"]]],但我认为这会引发一些异常。请发布您的示例数据和所需的结果。
  • @HYRY 感谢您的评论。我发布了一个指向我的示例数据的链接。我在发布之前使用了您的建议,并得到了我提到的“无效语法”错误。
  • @user1374969:数一下HYRY的建议中括号的个数,再数你的个数。
  • @DSM 谢谢。如果我选择 HYRY,我会收到 ValueError:具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all() python 不知道这是按位比较还是整列比较。
  • 这就是 HYRY 所说的“引发一些异常”的意思。您的尝试既有语法问题,也有接口问题。

标签: python-2.7 pandas dataframe


【解决方案1】:

有几种方法。使用apply

>>> 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"])

【讨论】:

  • 无法告诉您(在此站点上)您的深思熟虑的建议和查看同一问题的多种方式,我非常感谢您。谢谢。
  • 对于方法 #3,我得到时间序列对象没有属性“where”,因为它是一个 numpy 属性,我使用 np.where() 时出现相同的错误。你知道发生了什么吗?
  • 您使用的是哪个版本的pandas?我使用的是 0.10.1,上面的代码在你的数据上工作得很好。
  • 好的,是的,认为它正在运行版本“0.9.1”。使用 df['open'].shift(-1),我试图从满足 'where' 条件的位置提取 next 行的值 (i+1)。 IE,在我们满足 'where' 中定义的条件的行,将其称为 i , df["b"] 应该将值存储在 next i+1 的 df['open'] 中观察到这种情况后。 (现在,它似乎存储了 df['open'] 值,该值从文件的最开始位置开始 - 1 偏移)。似乎简单地 df["open"][i+1] 不会成功。
  • 我不确定我是否遵循。调用条件 M。如果你有 [Monday open=1, M=True;周二开盘=2,M=假;星期三 open=3, M=True],你希望星期一的 b 值是 2 还是 3?星期二的 b 值应该是多少?
【解决方案2】:

修改 DSM 的方法 3,在 np.where 中明确说明 True/False 值:

#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))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2015-07-31
    • 2017-08-09
    • 2021-07-13
    • 2019-08-01
    相关资源
    最近更新 更多