2017-12-03 2 views
0

Angesichts der folgenden Datenrahmen:Performing groupby Funktion mit zwei Spalten als Parameter unabhängig von der Reihenfolge der Spalten

Node_1 Node_2 Time 
A  B  6 
A  B  4 
B  A  2 
B  C  5 

Wie kann man erhalten, groupby oder andere Methoden verwenden, die Datenrahmen wie folgt:

Node_1 Node_2 Mean_Time 
A  B  4 
B  C  5 

die erste Zeile des Mean_Time indem der Durchschnitt aller Routen A-> B und B> A erhalten wird, das heißt (6 + 4 + 2)/3 = 4

+0

die Spalten zusammenfügen und dann die "mittlere" Operation durchführen? –

Antwort

0

etwas in den Zeilen sollte g ive Sie das gewünschte Ergebnis ... bekam dies viel hässlicher als es war: D

import pandas as pd 

data = {'Node_1': {0: 'A', 1: 'A', 2: 'B', 3: 'B'}, 
'Node_2': {0: 'B', 1: 'B', 2: 'A', 3: 'C'}, 
'Time': {0: 6, 1: 4, 2: 2, 3: 5}} 

df = pd.DataFrame(data) 

# Create new column to group by 
df["Node"] = df[["Node_1","Node_2"]].apply(lambda x: tuple(sorted(x)),axis=1) 
# Create Mean_time column 
df["Mean_time"] = df.groupby('Node').transform('mean') 
# Drop duplicate rows and drop Node and Time columns 
df = df.drop_duplicates("Node").drop(['Node','Time'],axis=1) 

print(df) 

Returns:

 Node_1 Node_2 Mean_time 
0  A  B   4 
3  B  C   5 

Eine Alternative wäre, zu verwenden:

df = (df.groupby('Node', as_index=False) 
      .agg({'Node_1':lambda x: list(x)[0], 
        'Node_2':lambda x: list(x)[0], 
        'Time': np.mean}) 
      .drop('Node',axis=1)) 
+0

@WeiErn Ich verstehe es nicht, das sollte auch für Namen funktionieren. –

+0

Danke für den Vorschlag, Anton! Ich wollte, dass die Großbuchstaben Platzhalter für die tatsächlichen Namen der Knoten sind, die aus einem oder mehreren Wörtern bestehen können, wie etwa "New York". Ich habe versucht, den Code zu ändern, der zum Erstellen der "Node" -Spalte verwendet wurde, [sortierte (x)], aber es wird eine 2-D-Liste. Kann ich irgendwo in der Spalte eine Liste mit zwei Strings erstellen? –

+0

@WeiErn Teilen Sie einige Beispieldaten! :) –

1

Sie könnten sortiere jede Reihe der Node_1 und Node_2 Säulen unter Verwendung von np.sort:

, die jetzt in df Ergebnisse aussehen wie:

Node_1 Node_2 Time 
0  A  B  6 
1  A  B  4 
2  A  B  2 
3  B  C  5 

Mit den Node Spalten sortiert, können Sie groupby/agg wie gewohnt:

result = df.groupby(cols).agg('mean').reset_index() 

import numpy as np 
import pandas as pd 

data = {'Node_1': {0: 'A', 1: 'A', 2: 'B', 3: 'B'}, 
'Node_2': {0: 'B', 1: 'B', 2: 'A', 3: 'C'}, 
'Time': {0: 6, 1: 4, 2: 2, 3: 5}} 

df = pd.DataFrame(data) 
nodes = df.filter(regex='Node') 
arr = np.sort(nodes.values, axis=1) 
cols = nodes.columns.tolist() 
df.loc[:, nodes.columns] = arr 

result = df.groupby(cols).agg('mean').reset_index() 
print(result) 

Ausbeuten

Node_1 Node_2 Time 
0  A  B  4 
1  B  C  5 
Verwandte Themen