Python 3.x 根据标签对数据帧条目进行选择性平均

Python 3.x 根据标签对数据帧条目进行选择性平均,python-3.x,pandas,Python 3.x,Pandas,我有一个数据帧 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 我还有一系列标签,大小与uniqueKD的总数相同 L=[0,0,0,1,1,1,1]它简单地表示KD==1与标签0关联K

我有一个数据帧

    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    
我还有一系列标签,大小与unique
KD的总数相同

L=[0,0,0,1,1,1,1]
它简单地表示
KD==1
与标签
0
关联
KD==2
与标签
0。。。KD==9,带有标签
1
等(
L
KD
的排序顺序存储)

现在我有两个列表,
l1=[1,2,5,9]
l2=[3,4,8]
。我想设置与
l2
中的
KD
值相对应的
DT
值,如果两者具有相同的标签,则它是
l1
DT
值的平均值

在本例中,
KD==3
l1
中的
KD=1和2
相同的标签(标签=0)。所以我们设置了
DT=(8.8+5.6)/2=7.2

我现在使用for循环来实现这一点,通过迭代
l2
,找到具有相同标签的
l1
条目,然后求平均值。有没有一种方法可以通过去掉for循环来非常有效地实现这一点

我的输出可以是以下形式的词典
d={3:7.2,4:5.2,8:5.2}
IIUC,首先设置KD列的索引,然后您可以选择'DT'并使用
其中
将非
isin(l1)
的值替换为Nan。然后,将列KD的
映射
转换为
L
中的组号,并获得
平均值。最后,
loc
仅使用
isin(l2)
的KD,并使用
来记录
以获得预期输出

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}

键值不是对应的
KD