猿问

获取不同列的平均值

我有一个如下所示的数据框。中的元素col_1与 中的元素相连col_2,给出 中的结果output_1。但是,col_2现在col_1也有一些元素。例如,虽然a-->b= 3,b-->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_1并col_2具有字符串值,而第三列“输出”具有数值。


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


有只小跳蛙
浏览 127回答 4
4回答

噜噜哒

我会使用 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].indexdf['average']=average我得到的结果如下:  col_1 col_2  output_1  average0     a     b         3     13.51     a     c         5      3.52     a     d         3      NaN3     b     a        24     13.54     b     c        12      7.55     b     d         5      NaN6     c     a         2      3.57     c     b         3      7.58     c     d         5      NaN

繁华开满天机

尝试这个。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"]/=2df2.drop("rows_count", axis=1, inplace=True)df=df.join(df2, on="col_12")print(df)并输出:col_1 col_2  output_10     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         5col_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]

蝴蝶不菲

已编辑你可以试试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 的更正

繁星点点滴滴

你可以试试.mean()。单击此处获取文档。尝试这个 :df['average']=df[['col_1','col_2']].mean(axis=1)
随时随地看视频慕课网APP

相关分类

Python
我要回答