2014-06-20 4 views
2

내가 같은 팬더 Dataframe에 행 조작에 의한 행을 수행하기 위해 노력하고 있어요 :팬더 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] 

은 기본적으로 내가 가격/분할 새 열 "비율"을 만들려면 구매 또는 가격/판매, abs (구매) 또는 abs (판매)가 더 큰가에 따라. 나는 이것을 수행하는 방법을 잘 모른다 ... apply 함수를 사용할 것인가?

감사합니다.

답변

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로 곱하십시오. 판매 가격이 높으면 곱셈은 0이됩니다.
  2. 대칭 조작을 수행하십시오.
  3. 마지막으로 함께 색인을 추가하여 "비율"이라는 열을 직접 설정하십시오. 첫째 행 DataFrame의에서 동작하는 함수를 정의 -

편집

여기에 적용하여 용액이다.

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

마지막으로, 적절하게 적용하여 Ratio 열 세트.

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

+0

감사합니다. 그러나 적용 함수 또는 이와 유사한 방법으로이를 수행하는 방법이 있습니까? – KidSudi

+2

신청서를 사용하여 솔루션을 포함하도록 답장을 편집했습니다. –

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)