Pracuję z dużym zestawem danych dla modelu uczenia maszynowego. Ponieważ zestaw danych jest ogromny, uruchomienie jednej z moich funkcji trwa zbyt długo. Czy istnieje funkcja pandy, która może zastąpić następujący kod:

  df = pd.DataFrame({'Weight':[45, 88, 45, 88, 45, 88, 54, 45, 88], 
               'Name':['Sam', 'Sia', 'Sam', 'Sia', 'Sam', 'Sia', 'Ryan', 'Sam', 'Sia'], 
               'Age':[100, 95, 93, 90, 10, 95, 92, 110, 33]}) 

  my_group = df.groupby(['Name'])

  col_names = []
  diff_range = 5                             
  for pair in my_group:
     for i in range(1, diff_range+1):
     col_names.append(str(i))
     difference_df[str(i)] = df['Age'].diff(i).shift(periods=-i)
  difference_df['d_id_max'] = difference_df[col_names].idxmax(axis=1)  

Powyższy kod najpierw pobiera każdą grupę, pobierając każdy wiersz mojej ramki danych i obliczając różnicę z tego wiersza kolumny „model_prediction” z następnymi 3 wierszami, a na końcu zwraca indeks wiersza, który ma maksymalną różnicę w stosunku do tego wiersza.

   Weight   Name    Age
 0  45      Sam     100
 1  88      Sia     95
 2  45      Sam     93
 3  88      Sia     90
 4  45      Sam     10
 5  88      Sia     95
 6  54      Ryan    92
 7  45      Sam     110
 8  88      Sia     33

Oczekiwany wynik:

   Weight   Name    Age     1     2       3      4     5    d_id_max
 0  45      Sam     100   -5.0  -7.0  -10.0   -90.0  -5.0   1
 1  88      Sia     95    -2.0  -5.0  -85.0     0.0  -3.0   4
 2  45      Sam     93    -3.0 -83.0    2.0    -1.0  17.0   5
 3  88      Sia     90   -80.0   5.0    2.0    20.0 -57.0   4
 4  45      Sam     10    85.0  82.0  100.0    23.0   NaN   3
 5  88      Sia     95    -3.0  15.0  -62.0     NaN   NaN   2
 6  54      Ryan    92    18.0 -59.0    NaN     NaN   NaN   1
 7  45      Sam     110   -77.0  NaN    NaN     NaN   NaN   1
 8  88      Sia     33      NaN  NaN    NaN     NaN   NaN  NaN
2
Saurabh 20 listopad 2019, 13:49
1
Czy możesz dodać również oczekiwane wyniki?
 – 
Erfan
20 listopad 2019, 13:52
Myślę, że ostatnia Sia w linii kodu 2 powinna być w cudzysłowie: „Sia”.
 – 
rajah9
20 listopad 2019, 16:03

1 odpowiedź

Użyj df.shift() aby obliczyć różnicę między wierszami, a następnie użyj df.idxmax(), aby uzyskać kolumnę z maksymalną wartością.

for i in range(1,6):
     df[i] = df['Age'].shift(-i) - df['Age']

df["d_id_max"] = df[[1,2,3,4,5]].idxmax(axis=1)

print(df)

Wynik:

  Weight   Name    Age     1     2       3      4     5    d_id_max
 0  45      Sam     100   -5.0  -7.0  -10.0   -90.0  -5.0   1
 1  88      Sia     95    -2.0  -5.0  -85.0     0.0  -3.0   4
 2  45      Sam     93    -3.0 -83.0    2.0    -1.0  17.0   5
 3  88      Sia     90   -80.0   5.0    2.0    20.0 -57.0   4
 4  45      Sam     10    85.0  82.0  100.0    23.0   NaN   3
 5  88      Sia     95    -3.0  15.0  -62.0     NaN   NaN   2
 6  54      Ryan    92    18.0 -59.0    NaN     NaN   NaN   1
 7  45      Sam     110   -77.0  NaN    NaN     NaN   NaN   1
 8  88      Sia     33      NaN  NaN    NaN     NaN   NaN  NaN
1
Sociopath 20 listopad 2019, 16:02