Mam zbiór danych, w którym mam 5 kolumn i wiele wierszy.

Musisz pomnożyć wartości na podstawie stanu

Uderzyła mnie logika, aby to wykonać, ze względu na operacje matematyczne do wykonania.

Wszystkie podane przykłady miały na celu utworzenie nowych kolumn na podstawie zestawu warunków, ale wymaga to modyfikacji w istniejącej kolumnie.

Pomoc będzie bardzo mile widziane.

0
Manoj Ravi 19 listopad 2019, 18:05
Używasz & zamiast and. Pierwszy z nich wykonuje bitowe AND, które nie wydaje się być tym, czego chcesz tutaj. Sugerowałbym również wyjęcie obliczenia indeksu z [ ] i umieszczenie go w zmiennej, aby zapewnić czytelność i możliwość walidacji.
 – 
gens
19 listopad 2019, 20:01

1 odpowiedź

Oto działające rozwiązanie:

import pandas as pd 

df = pd.DataFrame(
    [
    ['Liquid', 1, 2, 21, 22],
    ['Liquid', 23, 24, 5, 6],
    ['Gas/Vapour', 27, 28, 7, 8],
    ['Gas', 9, 10, 11, 12]
    ], columns = ['col1', 'col2', 'col3', 'col4', 'col5'])

liquid_row_indices = df[df['col1'] == 'Liquid'].index.tolist()
gas_vapour__row_indices = df[df['col1'] == 'Gas/Vapour'].index.tolist()


df.iloc[liquid_row_indices, 1:] = df.iloc[liquid_row_indices, 1:].applymap(
                                  lambda x: x*1000 if x<20 else x)

df.iloc[gas_vapour__row_indices, 1:] = df.iloc[gas_vapour__row_indices, 1:].applymap(
                                       lambda x: x*1.024 if x<20 else x)

Wynik będzie:

col1    col2    col3    col4    col5
0   Liquid  1000    2000    21.000  22.000
1   Liquid  23  24  5000.000    6000.000
2   Gas/Vapour  27  28  7.168   8.192
3   Gas 9   10  11.000  12.000

Podsumowując logikę:

1) Przechowujemy numery wierszy, w których stan jest równy „Fluid” i „Gas / Vapor”

2) Następnie dla tych wierszy w ramce danych, dla wszystkich kolumn (z wyjątkiem pierwszej), applymap wykonujemy funkcję lambda i zastępujemy oryginalną wartość wartością zwróconą przez funkcję lambda.

3) Funkcja lambda sprawdzi, czy wartość jest <20, jeśli tak, pomnoży tę wartość przez 1000 (dla stanu płynnego) lub przez 1,024 (dla stanu gaz / para), jeśli nie, to zwróci tę samą wartość, co oryginał .

1
Nick Scriabin 19 listopad 2019, 19:54