2017-08-24 2 views
1

Ich versuche, auf alle Zeilen des Ergebnisses von groupby zu operieren. Grundsätzlich habe ich in etwa wie folgt:In mehreren Reihen in pandas 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) 

Außer Ich habe mehr als ein Dutzend unterschiedliche 'Aufgaben' (a, b, c, d, .... z) in jeder Gruppe. Und nicht alle Gruppen haben garantiert alle Aufgaben, außer die Aufgabe "d" ist garantiert. Neben der Aufgabe 'd' wird es mindestens eine weitere Aufgabe geben.

In jedem groupby Folge ich Unterschied zwischen d.start und Ende aller anderen Aufgaben erhalten möchten. Wie mache ich das?

Ich habe versucht, eine Anwendungsfunktion und das scheint eine Reihe zurückgeben. Aber ich bekomme NaN für alles andere als "d". Ich denke, ich bin mir nicht sicher, wie man von allen anderen Aufgaben in jeder Gruppe die Werte von "Anfang" und "Start" subtrahiert.

Vielen Dank!

Antwort

2

Betrachten pivot() und sub() Verwendung:

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

Mit df vom OP-Code erzeugt, wie:

  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 

Ausgabe von sub():

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