Pandas Dataframe逐行填充新列

时间:2014-06-20 12:48:53

标签: python pandas dataframe apply

我正在尝试对Pandas Dataframe执行逐行操作:

df = pd.DataFrame(columns=['Product', 'Price', 'Buy', 'Sell'])
df.loc[len(df.index)] = ["Apple", 1.50, 3, 2]
df.loc[len(df.index)] = ["Banana", 0.75, -8, 4]
df.loc[len(df.index)] = ["Carrot", 2.00, -6, -3]
df.loc[len(df.index)] = ["Blueberry", 0.05, 5, 6]

基本上我想创建一个新列"比率"除了价格/买入或价格/卖出,取决于哪个(买入)或绝对(卖出)更大。我不确定如何做到这一点......我会使用应用函数吗?

谢谢!

2 个答案:

答案 0 :(得分:7)

您可以直接使用列索引(http://pandas.pydata.org/pandas-docs/stable/indexing.html)来比较和过滤比率。

buy_ratio = (abs(df["Buy"])  > abs(df["Sell"])) * df["Price"] / df["Buy"]
sell_ratio = (abs(df["Buy"])  <= abs(df["Sell"])) * df["Price"] / df["Sell"]
df["Ratio"] = buy_ratio + sell_ratio

在这种情况下,

  1. 条件(abs(df["Buy"]) > abs(df["Sell"]))给出0/1值列,具体取决于买入或卖出是否更大。您将该列乘以Price / Buy。如果卖出价格很高,则乘法将为零。
  2. 执行Sell
  3. 的对称操作
  4. 最后,将它们一起添加并直接设置名为&#34; Ratio&#34;的列。使用索引。
  5. 修改

    以下是使用apply的解决方案 - 首先定义一个在DataFrame的中运行的函数。

    def f(row):
      if abs(row["Buy"]) > abs(row["Sell"]):
        return row["Price"] / row["Buy"]
      else:
        return row["Price"] / row["Sell"]
    

    最后,使用apply。

    正确设置Ratio

    df["Ratio"] = df.apply(f, axis=1)

答案 1 :(得分:3)

这样的事情怎么样?仔细检查逻辑。

df['Ratio'] = df.apply(
    lambda x: (x.Price / x.Sell) if abs(x.Buy) < abs(x.Sell) else (x.Price / x.Buy),
    axis=1)