2017-08-24 85 views
1

我試圖對groupby的結果的所有行進行操作。 基本上我有類似如下:在熊貓羣的多行上操作

import pandas as pd 
import numpy as np 

def tdiff(dff): 
# return(dff[dff.task.eq('d')].start - dff[dff.task.ne('d')].end) 
    return(dff[dff.task.eq('d')].start - dff.end) 

a = [] 
p = 0 
while p < 6: 
    i = 0 
    while i < 4: 
     a.insert(i,p) 
     i = i + 1 
    p = p + 1 

d={'task':pd.Series(6*['a','b','c','d'],name='task'), 
    'jobid':pd.Series(a), 
    'start':pd.Series(np.random.randn(24)), 
    'end':pd.Series(np.random.randn(24))} 

df = pd.DataFrame(d) 

print(df) 

dt = df.groupby('jobid').apply(tdiff) 
dt.name='tdiff' 
print(type(dt)) 
print(dt) 

除我有每組十多個不同的 '任務'(A,B,C,d,... z)表示。並且並不是所有的團隊都保證除了任務'd'之外的所有任務都有保證。除了任務'd'之外,還有至少1個任務。

在每個GROUPBY導致我想d.start年底的所有其他任務之間獲得的區別。 我該怎麼做?

我試過了一個應用函數,看起來好像返回了一個系列。但是,除了'd'以外,我都會得到NaN。我想我不知道如何從每組中所有其他任務的「開始」值中減去d.end。

謝謝!

回答

2

考慮使用pivot()sub()

df2 = df.pivot(columns="task", index="jobid") 
df2.end.sub(df2.start.d, axis=0) 

隨着從OP代碼生成df爲:

輸出 sub()
  end jobid  start task 
0 -1.223702  5 -0.458517 a 
1 0.045843  5 -0.676103 b 
2 -0.661233  5 1.213528 c 
3 -0.339473  5 0.090109 d 
4 2.474916  4 0.069272 a 
5 0.562003  4 0.307962 b 
6 0.286008  4 -0.045996 c 
7 0.770700  4 1.053486 d 
8 -0.948754  3 -0.173639 a 
9 0.576441  3 -1.085345 b 
10 0.098523  3 1.399861 c 
11 0.983254  3 -0.976588 d 
12 -0.286155  2 -0.542215 a 
13 -1.959281  2 -0.436720 b 
14 1.020525  2 1.050937 c 
15 0.815528  2 2.173647 d 
16 0.158771  1 -2.584689 a 
17 0.239464  1 0.521442 b 
18 0.463753  1 -0.919359 c 
19 0.430110  1 -0.996819 d 
20 0.084908  0 0.599807 a 
21 0.615123  0 -1.563351 b 
22 -0.027279  0 -0.755369 c 
23 0.826941  0 2.228655 d 

task   a   b   c   d 
jobid           
0  -2.143747 -1.613532 -2.255934 -1.401714 
1  1.155591 1.236284 1.460572 1.426930 
2  -2.459802 -4.132928 -1.153122 -1.358119 
3  0.027834 1.553029 1.075111 1.959842 
4  1.421430 -0.491483 -0.767478 -0.282786 
5  -1.313812 -0.044266 -0.751343 -0.429582