我有一个数据框,如下所示。 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)
,但是没有用。
任何建议将不胜感激。
答案 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)