Как заменить два столбца условием в pandas? - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть Pandas DataFrame, в котором есть товары, действия, количество и цена. Если действие «ПРОДАВАТЬ», мне нужно учитывать цену 0 для продукта, а также инвертировать количество.

Что я пробовал:

import pandas as pd


def my_function(df):
    kwargs = {
        "quantity": lambda x: -x["quantity"] if "SELL" in str(x["action"]) else x["quantity"],
        "price (usd)": lambda x: 0 if "SELL" in str(x["action"]) else x["price (usd)"],
    }
    return df.assign(**kwargs)


input_df = pd.DataFrame({"product": ["APPLE", "APPLE", "BANANA"],
                         "action": ["  SELL  ", "  BUY  ", "  SELL  "],
                         "quantity": [1, 2, 3],
                         "price (usd)": [3, 5, 8],
                         })

result_df = my_function(input_df)

expected_df = pd.DataFrame({"product": ["APPLE", "APPLE", "BANANA"],
                            "action": ["  SELL  ", "  BUY  ", "  SELL  "],
                            "quantity": [-1, 2, -3],
                            "price (usd)": [0, 5, 0],
                            })

Каким-то образом условия в моем Лямбда-выражения всегда возвращают True, и я также думаю, что это может быть более простым способом сделать это. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Мы можем сделать

s=input_df.action.str.contains('SELL')
input_df.quantity*=s.map({True:-1,False:1})
input_df["price (usd)"]*=~s
input_df
  product    action  quantity  price (usd)
0   APPLE    SELL          -1            0
1   APPLE     BUY           2            5
2  BANANA    SELL          -3            0

В функции

def my(x):
...     s=x.action.str.contains('SELL')
...     x.quantity*=s.map({True:-1,False:1})
...     x["price (usd)"]*=~s
...     return (x)


out=my(input_df)
out
  product    action  quantity  price (usd)
0   APPLE    SELL          -1            0
1   APPLE     BUY           2            5
2  BANANA    SELL          -3            0
1 голос
/ 21 апреля 2020

Код ниже исправляет это. Я получил желаемый результат.

def my_function(df):
    kwargs = {
        "quantity": df.apply(lambda x: -x["quantity"] if "SELL" in str(x["action"]) else x["quantity"], axis = 1),
        "price (usd)": df.apply(lambda x: 0 if "SELL" in str(x["action"]) else x["price (usd)"], axis = 1),
    }
    return df.assign(**kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...