计算列中唯一值之间的差异,并按唯一值的数量平均,并在 Python 中按另一列分组
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 = 14
和29 - 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
回复
我来回复-
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年前