Python 使用两列作为参数执行groupby函数,而不考虑列的顺序

Python 使用两列作为参数执行groupby函数,而不考虑列的顺序,python,pandas,pandas-groupby,Python,Pandas,Pandas 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的平均值来获得第一行的平均时间,即(6+4+2)/3=4行中的某些内容应该会给出所需的结果。。。这比实际情况要

给定以下数据帧:

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的平均值来获得第一行的平均时间,即
(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))

您可以使用以下命令对
节点_1
节点_2
列的每一行进行排序:

这导致
df
现在看起来像:

  Node_1 Node_2  Time
0      A      B     6
1      A      B     4
2      A      B     2
3      B      C     5
通过对
节点
列进行排序,您可以像往常一样
groupby/agg

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

屈服

  Node_1 Node_2  Time
0      A      B     4
1      B      C     5

将各列连接在一起,然后执行“平均”操作?@WeiErn我不明白,这应该也适用于名称。谢谢你的建议,安东!我打算将大写字母作为节点实际名称的占位符,这些节点可能由一个或多个单词组成,例如“纽约”。我尝试将用于创建“Node”列的代码更改为[sorted(x)],但它变成了一个二维列表。有什么地方可以让这个列成为两个字符串的列表吗?@WeiErn共享一些示例数据!:)@如何:
tuple(sorted(x))
,如上所述,您可以获得一个带有
[sorted(i)for i in df[[“Node_1”,“Node_2”]]的列表。值]
,但这不是您要分组的内容。
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