获取不同列的平均值

时间:2019-10-17 07:12:10

标签: python dataframe

我有一个数据框,如下所示。 col_1中的元素连接到col_2中的元素,从而在output_1中给出结果。但是,col_2中的某些元素现在也已在col_1中。例如,当a-->b= 3b-->a= 24时。

col_1   col_2   output_1    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中的人。输出为duration。我想计算每对人之间的平均时长。 col_1col_2具有字符串值,而第三列“输出”具有数字值。

我尝试使用pd.merge(df.col_1, df.col_2),但是没有用。 任何建议将不胜感激。

4 个答案:

答案 0 :(得分:2)

我会使用numpy广播:

i,j=np.where((df.col_1+df.col_2).values==(df.col_2+df.col_1).values[:,None])

average=0.5*(df.iloc[i].output_1.reset_index(drop=True)+\
         df.iloc[j].output_1.reset_index(drop=True))

average.index=df.iloc[i].index
df['average']=average

我得到的结果如下:

  col_1 col_2  output_1  average
0     a     b         3     13.5
1     a     c         5      3.5
2     a     d         3      NaN
3     b     a        24     13.5
4     b     c        12      7.5
5     b     d         5      NaN
6     c     a         2      3.5
7     c     b         3      7.5
8     c     d         5      NaN

答案 1 :(得分:1)

编辑

您可以尝试

for ii in a['col_1'].unique():
    p = pd.merge(a[a['col_1'] == ii], a[a['col_2'] == ii], left_on = 'col_2', right_on = 'col_1', left_index = True)
    a.loc[p.index, 'mean'] = p.mean(axis = 1)

感谢@baccandr进行纠正

答案 2 :(得分:1)

尝试一下。您可以删除col_12列,或进一步将其用作一对唯一键(与元素顺序无关)。

print(df)

df["col_12"]=df[["col_1", "col_2"]].apply(lambda x: str(sorted(x)), axis=1)
df2=df.groupby(df["col_12"]).agg({"output_1": "mean", "col_1": "count"}).rename(columns={"output_1": "output_1_mean", "col_1": "rows_count"})

df2.loc[df2["rows_count"]==1, "output_1_mean"]/=2
df2.drop("rows_count", axis=1, inplace=True)
df=df.join(df2, on="col_12")

print(df)

并输出:

col_1 col_2  output_1
0     a     b         3                                     
1     a     c         5                                     
2     a     d         3                                     
3     b     a        24                                     
4     b     c        12                                     
5     b     d         5                                     
6     c     a         2                                     
7     c     b         3                                     
8     c     d         5

col_1 col_2  output_1      col_12  output_1_mean          
0     a     b         3  ['a', 'b']           13.5          
1     a     c         5  ['a', 'c']            3.5          
2     a     d         3  ['a', 'd']            1.5          
3     b     a        24  ['a', 'b']           13.5          
4     b     c        12  ['b', 'c']            7.5          
5     b     d         5  ['b', 'd']            2.5          
6     c     a         2  ['a', 'c']            3.5          
7     c     b         3  ['b', 'c']            7.5          
8     c     d         5  ['c', 'd']            2.5          
[Program finished]

答案 3 :(得分:0)

您可以尝试.mean()click here获取文档。

尝试一下:df['average']=df[['col_1','col_2']].mean(axis=1)