Почему труба или применить не работает должным образом на groupby на пандах? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть DataFrame со столбцами col1, col2, col3.Я хочу создать еще один col4, который содержит col2 [n + 3] / col2-1 для каждой группы в col1 отдельно.

+-----+------+-----+
|col1 | col2 | col3|
+-----+------+-----+    
|  A  |  2   |  4  |
+-----+------+-----+    
|  A  |  4   |  5  | 
+-----+------+-----+    
|  A  |  7   |  7  | 
+-----+------+-----+    
|  A  |  3   |  8  | 
+-----+------+-----+    
|  A  |  7   |  3  | 
+-----+------+-----+    
|  B  |  8   |  9  |
+-----+------+-----+    
|  B  |  10  |  10 | 
+-----+------+-----+    
|  B  |  8   |  9  |
+-----+------+-----+    
|  B  |  20  |  15 |
+-----+------+-----+

Выходные данные должны быть

   +-----+------+-----+-----+
   |col1 | col2 | col3| col4|
   +-----+------+-----+-----+    
   | A   |    2 |   4 |  0.5|  #(3/2-1)
   +-----+------+-----+-----+    
   | A   |    4 |   5 | 0.75| #(7/4-1)
   +-----+------+-----+-----+    
   | A   |    7 |   7 |  NA |
   +-----+------+-----+-----+    
   | A   |    3 |   8 |  NA |
   +-----+------+-----+-----+    
   | A   |    7 |   3 |  NA |
   +-----+------+-----+-----+    
   | B   |    8 |   9 | 1.5 |
   +-----+------+-----+-----+    
   | B   |   10 |  10 |  NA |
   +-----+------+-----+-----+    
   | B   |    8 |  9  |  NA |
   +-----+------+-----+-----+    
   | B   |   20 |  15 |  NA |
   +-----+------+-----+-----+

Мой код

df['col4']= df.groupby('col1').apply(lambda x:a['col2'].shift(-3)/a['col2']-1)

, что приводит к col4 со всеми сущностями в виде 'NA'.

Я также использовал

df['col4']= df.groupby('col1').pipe(lambda x:a['col2'].shift(-3)/a['col2']-1)

, который не учитывает группы 'A' и 'B' и приводит к

 +-----+------+-----+-------+  
 |col1 | col2 | col3| col4  |
 +-----+------+-----+-------+      
 | A   |  2   |  4  | 0.5   |
 +-----+------+-----+-------+      
 | A   |  4   |  5  | 0.75  |
 +-----+------+-----+-------+      
 | A   |  7   |  7  | 0.1428|
 +-----+------+-----+-------+          
 | A   |  3   |  8  | 2.33  |
 +-----+------+-----+-------+          
 | A   |  7   |  3  | 0.1428|
 +-----+------+-----+-------+          
 | B   |  8   |  9  | 1.5   |
 +-----+------+-----+-------+          
 | B   | 10   | 10  | NA    |
 +-----+------+-----+-------+          
 | B   |  8   |  9  | NA    |
 +-----+------+-----+-------+          
 | B   | 20   | 15  | NA    |
 +-----+------+-----+-------+      

Кто-нибудь знает, как выполнить эту задачу или исправить ошибку?проблема моих кодов?

1 Ответ

0 голосов
/ 27 декабря 2018

IIUC:

df['col4'] = df.groupby('col1')['col2'].transform(lambda x: x.shift(-3)) / df['col2'] - 1

Вывод:

  col1  col2  col3  col4
0    A     2     4  0.50
1    A     4     5  0.75
2    A     7     7   NaN
3    A     3     8   NaN
4    A     7     3   NaN
5    B     8     9  1.50
6    B    10    10   NaN
7    B     8     9   NaN
8    B    20    15   NaN

Используйте transform, чтобы переместить 'col2' в каждой группе, затем разделите на 'col2' и вычтите 1.

...