【问题标题】:Pandas Dataframe row by row fill new columnPandas Dataframe 逐行填充新列
【发布时间】:2014-06-20 12:48:52
【问题描述】:

我正在尝试对 Pandas 数据框执行逐行操作:

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]

基本上,我想创建一个新列“比率”来划分价格/买入或价格/卖出,具体取决于哪个 abs(buy) 或 abs(sell) 更大。我不太确定如何执行此操作...我可以使用 apply 函数吗?

谢谢!

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:

    您可以直接使用列索引 (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"]) &gt; abs(df["Sell"])) 给出一个0/1 值列,具体取决于买入还是卖出更大。您将该列乘以价格/购买。如果售价很高,则乘数为零。
    2. 对 Sell 执行对称操作
    3. 最后将它们相加,直接使用索引设置名为“Ratio”的列。

    编辑

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

    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)

    【讨论】:

    • 感谢这项工作!但是有没有办法通过应用函数或其他东西来做到这一点?
    • 我已使用 apply 编辑回复以包含解决方案
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2019-04-26
      • 2013-06-10
      • 2019-09-30
      • 2018-09-09
      • 2014-09-25
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多