我有一个数据框,如下所示。 col_1
中的元素连接到col_2
中的元素,从而在output
中给出结果。另一方面,col_2
中的某些元素也在col_1
中。例如:a-->b= 3
和b-->a= 24
。
col_1 col_2 output average
a b 3 13.5 (because a-->b=3 and b-->a=24)
a c 5 3.5 (because a-->c=5 and c-->a=2)
a d 3
b a 24
b c 12
b d 5
c a 2
c b 3
c d 5
我需要计算这两个值的平均值,当然还要计算整个数据框内所有类似情况。
您可以认为数据如下:col_1中的人正在呼叫col_2中的人。输出是持续时间。我想计算每对人之间的平均时长
我尝试使用pd.merge(df.col_1, df.col_2)
,但是没有用。
任何建议将不胜感激。
答案 0 :(得分:2)
这是实现这一目标的一种方法,尽管我可能对您故意过分简化的示例了解过多。
In [15]: df = pd.DataFrame({
...: 'col_1': list('aaabbbccc'),
...: 'col_2': list('bcdacdabd'),
...: 'output': [3,5,3,24,12,5,2,3,5]})
In [16]: # Add a (temporary) column with the union of col_1 and col_2
...: df['uniques'] = df[['col_1', 'col_2']].apply(np.unique, axis=1).astype(str)
...:
In [17]: # Then simply groupby it and average it out
...: df['mean'] = df.groupby(['uniques']).transform(np.mean)
In [18]: df
Out[18]:
col_1 col_2 output uniques mean
0 a b 3 ['a' 'b'] 13.5
1 a c 5 ['a' 'c'] 3.5
2 a d 3 ['a' 'd'] 3.0
3 b a 24 ['a' 'b'] 13.5
4 b c 12 ['b' 'c'] 7.5
5 b d 5 ['b' 'd'] 5.0
6 c a 2 ['a' 'c'] 3.5
7 c b 3 ['b' 'c'] 7.5
8 c d 5 ['c' 'd'] 5.0
答案 1 :(得分:1)
您可以对两列进行水平和分组排序:
s = pd.DataFrame(np.sort(df[['col_1','col_2']].values, axis=1), index=df.index)
df['mean'] = df['output'].groupby([s[0],s[1]]).transform('mean')
输出:
col_1 col_2 output mean
0 a b 3 13.5
1 a c 5 3.5
2 a d 3 3.0
3 b a 24 13.5
4 b c 12 7.5
5 b d 5 5.0
6 c a 2 3.5
7 c b 3 7.5
8 c d 5 5.0