2017-12-03 151 views

回答

0

在應該克東西線香港專業教育學院,你所期望的結果......這讓醜陋了很多比它: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) 

返回:

 Node_1 Node_2 Mean_time 
0  A  B   4 
3  B  C   5 

另一種方法是使用:

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我不明白,這也適用於名字。 –

+0

感謝您的建議,安東!我打算讓大寫字母作爲可能包含一個或多個單詞的節點的實際名稱的佔位符,例如「紐約」。 我試着將用於創建「節點」列的代碼更改爲[排序(x)],但它變成了一個二維列表。有什麼地方可以讓列成爲兩個字符串的列表嗎? –

+0

@WeiErn分享一些樣品數據! :) –

1

你可以使用np.sortNode_1Node_2列的每一行進行排序:

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

導致df現在看起來像:

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

隨着Node列排序,你可以groupby/agg像往常一樣:

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) 

產量

Node_1 Node_2 Time 
0  A  B  4 
1  B  C  5 
相關問題