获取跨不同列的值的平均值

2024-04-23 19:02:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧。col_1中的元素连接到col_2中的元素,得到output_1中的结果。但是,col_2中的一些元素现在也在col_1中。例如,while 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具有字符串值,而第三列“output”具有数字值。你知道吗

我试过使用pd.merge(df.col_1, df.col_2),但没有成功。 如有任何建议,我们将不胜感激。你知道吗


Tags: and数据字符串元素dfoutput情况数字
3条回答

试试这个。列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]

我会使用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

编辑

你可以试试

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的更正

相关问题 更多 >