2014-06-20 283 views
2

我想这样对大熊猫数据帧进行逐行操作:熊猫据帧逐行填写新列

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(买入)或abs(卖出)更大。我真的不知道如何做到这一点...我会使用应用函数吗?

谢谢!

回答

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看重列。您将该列乘以价格/购买。如果卖出价格高,乘法将为零。
  2. 执行销售的对称操作
  3. 最后,将它们加在一起,并使用索引直接设置名为“比率”的列。

编辑

下面是使用应用的解决方案 - 首先定义在行数据帧的操作的功能。

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)

+0

谢谢你的工作!但是有没有办法通过应用函数或其他方法来实现呢? – KidSudi

+2

我已经编辑了使用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)