在两个不同的列中取平均值

时间:2019-10-18 15:58:28

标签: python pandas

我有一个数据框,如下所示。 col_1中的元素连接到col_2中的元素,从而在output中给出结果。另一方面,col_2中的某些元素也在col_1中。例如:a-->b= 3b-->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),但是没有用。 任何建议将不胜感激。

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