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

时间:2020-04-30 11:19:38

标签: 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    

我还有一个标签数组,大小与唯一KD的总数相同

L = [ 0, 0, 0, 1, 1, 1, 1]仅表示KD == 1与标签0 KD == 2与标签0 ... KD == 9与标签1等相关联({{ 1}}的存储顺序为L)。

现在我有两个列表,KDl1 = [1,2,5,9]。我想设置与l2 = [3,4,8]中的DT值相对应的KD的值,以使其为l2DT值的平均值,如果两者都具有相同的标签。

在示例中,l1KD == 3KD = 1 and 2的标签(标签= 0)相同。因此我们设置了l1

我现在使用for循环进行此操作,方法是遍历DT = (8.8 + 5.6)/2 = 7.2并找到具有相同标签的l2项,然后取平均。有没有一种方法可以通过摆脱for循环来非常有效地做到这一点?

我的输出可以是以下形式的字典 l1

1 个答案:

答案 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}
相关问题