计算列中唯一值之间的差异,并按唯一值的数量平均,并在 Python 中按另一列分组

xiaoxingxing python 208

原文标题Calculating the differences between unique values in the column and averaging by number of unique values with grouping by another column in Python

我有一个数据框,需要做一些自定义计算。

Protocol    Visit   Day
111 1   1
111 1   1
111 1   1
111 2   15
111 2   15
111 2   15
111 3   29
111 3   29
222 2   14
222 2   14
222 2   14
222 3   28
222 3   28
222 3   28

可重现的输入:

{'Protocol ': {0: 111, 1: 111, 2: 111, 3: 111, 4: 111, 5: 111, 6: 111, 7: 111, 8: 222, 9: 222, 10: 222, 11: 222, 12: 222, 13: 222, 14: 222}, 'Visit': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 1, 9: 2, 10: 2, 11: 2, 12: 3, 13: 3, 14: 3}, 'Day': {0: 1, 1: 1, 2: 1, 3: 15, 4: 15, 5: 15, 6: 29, 7: 29, 8: 1, 9: 14, 10: 14, 11: 14, 12: 28, 13: 28, 14: 28}}

我想要什么:

  • 以某种方式计算 Day 列中的值之间的唯一值之间的差异。

例如,对于协议 111,它将是15-1 = 1429 - 15 = 14。相同的逻辑应该适用于特定协议列中的所有数字,因为每个协议我都会有更多。

  • 然后我想计算每个协议的平均差异。 14 + 14 = 28/3 = 9.3。 3 表示用于计算差异的 3 个唯一值 – 1、15、29。

对于协议 222,它将被28-14 = 14除以 2(唯一值的数量)。结果7

预期产出

Protocol Average difference
111       9.3 
222       7 

原文链接:https://stackoverflow.com//questions/71465932/calculating-the-differences-between-unique-values-in-the-column-and-averaging-by

回复

我来回复
  • jezrael的头像
    jezrael 评论

    首先使用DataFrame.drop_duplicates通过两列,然后聚合 lambda 函数以获得差异的平均值:

    #remove traling whitespaces in columns names
    df.columns = df.columns.str.strip()
    
    df1 = (df.drop_duplicates(['Protocol','Day'])
             .groupby('Protocol')['Day']
             .agg(lambda x: x.diff().sum() / len(x))
             .reset_index(name='Average difference'))
    print (df1)
       Protocol  Average difference
    0       111            9.333333
    1       222            7.000000
    

    要么:

    df1 = (df.drop_duplicates(['Protocol','Day'])
             .groupby('Protocol')['Day']
             .agg(lambda x: x.diff().fillna(0).mean())
             .reset_index(name='Average difference'))
    
    2年前 0条评论