我有一个数据框
ID KD DT
0 4 2 5.6
1 4 5 8.7
4 4 8 1.9
5 4 9 1.7
6 4 1 8.8
3 4 3 7.2
9 4 4 3.1
我还有一个标签数组,大小与唯一KD
的总数相同
L = [ 0, 0, 0, 1, 1, 1, 1]
仅表示KD == 1
与标签0
KD == 2
与标签0 ... KD == 9
与标签1
等相关联({{ 1}}的存储顺序为L
)。
现在我有两个列表,KD
和l1 = [1,2,5,9]
。我想设置与l2 = [3,4,8]
中的DT
值相对应的KD
的值,以使其为l2
中DT
值的平均值,如果两者都具有相同的标签。
在示例中,l1
与KD == 3
中KD = 1 and 2
的标签(标签= 0)相同。因此我们设置了l1
。
我现在使用for循环进行此操作,方法是遍历DT = (8.8 + 5.6)/2 = 7.2
并找到具有相同标签的l2
项,然后取平均。有没有一种方法可以通过摆脱for循环来非常有效地做到这一点?
我的输出可以是以下形式的字典
l1
答案 0 :(得分:1)
IIUC,首先set_index KD列,然后可以选择'DT'并用where
用Nan替换不是isin(l1)
的值。然后您在groupby.transform
中的map
KD列中的L
及其组号中得到mean
。最后,loc
仅是isin(l2)
的KD,并使用to_dict
来获得期望的输出
df_ = df.set_index('KD')
print ( df_['DT'].where(df_.index.isin(l1))\
.groupby(df_.index.map(pd.Series(L, df_.index.sort_values())))\
.transform('mean')\
.loc[df_.index.isin(l2)]\
.to_dict()
)
{8: 5.199999999999999, 3: 7.2, 4: 5.199999999999999}