Kid*_*udi 2 python apply dataframe pandas
我试图在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]
Run Code Online (Sandbox Code Playgroud)
基本上我想创建一个新的列"比率",它将价格/买入或价格/卖出分开,具体取决于哪个(买入)或者卖出(卖出)更大.我不确定怎么做...我会使用apply函数吗?
谢谢!
您可以直接使用列索引(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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,
(abs(df["Buy"]) > abs(df["Sell"]))根据买入或卖出是否更大,该条件给出0/1值列.您将该列乘以Price/Buy.如果卖出价格很高,则乘法将为零.编辑
以下是使用apply的解决方案 - 首先定义一个在DataFrame的行中运行的函数.
def f(row):
if abs(row["Buy"]) > abs(row["Sell"]):
return row["Price"] / row["Buy"]
else:
return row["Price"] / row["Sell"]
Run Code Online (Sandbox Code Playgroud)
最后,Ratio使用apply适当地设置列.
df["Ratio"] = df.apply(f, axis=1)