Mam taką ramkę danych:

Time      Name     Value
2007Q1    A        30
2007Q2    A        35
2007Q3    A        28
...
2007Q1    B        31
2007Q2    B        50
2007Q3    B        60
...
2007Q1    C        20
2007Q2    C        15
2007Q3    C        30

Chcę dodać kolejną kolumnę o nazwie wyników i wykonaj obliczenia między każdym rzędem dla każdej nazwy. Chcę użyć wartości przez jedną czwartą podzieloną przez wartość dla poprzedniego kwartału, a następnie minus 1, który jest podobny jako wartość (Q2) / wartość (Q1) -1 . Chcę również grupować według nazwy, wykonaj obliczenie w wierszach o tej samej nazwie. Wyniki powinny być jak:

Time      Name     Value    Results
2007Q1    A        30       
2007Q2    A        35       0.1667
2007Q3    A        28       -0.2
...
2007Q1    B        31       
2007Q2    B        50       0.6129
2007Q3    B        60       0.2
...
2007Q1    C        20
2007Q2    C        15       -0.25
2007Q3    C        30       1

Czas rozpoczęcia dla każdej nazwy "nie powinien mieć żadnej wartości dla wyników.

Dzięki wszystkim, którzy mogą pomóc!

1
Kristine Lian 24 lipiec 2020, 20:34

1 odpowiedź

Najlepsza odpowiedź

Użyj DataFrame.groupby na Name i użyj groupby.shift Aby przesunąć kolumnę Value, a następnie użyj Series.div, aby podzielić go z Value, wreszcie użyj Series.sub do odejścia 1:

df['Results'] = df['Value'].div(df.groupby('Name')['Value'].shift()).sub(1)

Wynik:

print(df)
     Time Name  Value   Results
0  2007Q1    A     30       NaN
1  2007Q2    A     35  0.166667
2  2007Q3    A     28 -0.200000
3  2007Q1    B     31       NaN
4  2007Q2    B     50  0.612903
5  2007Q3    B     60  0.200000
6  2007Q1    C     20       NaN
7  2007Q2    C     15 -0.250000
8  2007Q3    C     30  1.000000
2
Shubham Sharma 24 lipiec 2020, 17:42