的量級:執行使用兩個列作爲參數GROUPBY功能無論給定以下數據幀中的列
Node_1 Node_2 Time
A B 6
A B 4
B A 2
B C 5
一個如何獲得,使用GROUPBY或其它方法中,數據幀如下:
Node_1 Node_2 Mean_Time
A B 4
B C 5
第一行的通過找到的所有路由的平均A-> B和B-> A而獲得Mean_Time,即(6 + 4 + 2)/3 = 4
的量級:執行使用兩個列作爲參數GROUPBY功能無論給定以下數據幀中的列
Node_1 Node_2 Time
A B 6
A B 4
B A 2
B C 5
一個如何獲得,使用GROUPBY或其它方法中,數據幀如下:
Node_1 Node_2 Mean_Time
A B 4
B C 5
第一行的通過找到的所有路由的平均A-> B和B-> A而獲得Mean_Time,即(6 + 4 + 2)/3 = 4
在應該克東西線香港專業教育學院,你所期望的結果......這讓醜陋了很多比它: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))
@WeiErn我不明白,這也適用於名字。 –
感謝您的建議,安東!我打算讓大寫字母作爲可能包含一個或多個單詞的節點的實際名稱的佔位符,例如「紐約」。 我試着將用於創建「節點」列的代碼更改爲[排序(x)],但它變成了一個二維列表。有什麼地方可以讓列成爲兩個字符串的列表嗎? –
@WeiErn分享一些樣品數據! :) –
你可以使用np.sort
對Node_1
和Node_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
將列連接在一起,然後執行「mean」操作? –