2014-06-20 476 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)