![](/img/trans.png)
[英]pyspark sum of rows to get one new row based on values in another column in groupby
[英]sum rows of column based on a repeating range of values in another with pandas groupby
我有一个 DataFrame 有几千行,看起来像这样:
Index Chan Pick
1 1 0.001
2 2 0.001
3 3 0.001
4 4 0.001
5 1 0.003
6 2 0.003
7 3 0.003
8 1 0.006
9 2 0.006
10 1 0.002
11 2 0.002
12 3 0.002
13 4 0.002
14 5 0.002
15 6 0.002
channel Chan
列的值范围可以从 1 到 24(有时可能有所有 24 个值,有时可能只有 2 个值或 6 个值,等等,如上所示)。 Pick
列中的值对于每组通道值通常是相同的。
我需要来自公共通道块的Pick
列中的平均值(即第一个块的平均值为 0.001...第二个块的平均值为 0.003,因为Pick
值都相同,但有时它们可能不同)。
我知道我需要使用类似于:
df.groupby('Chan')['Pick'].mean()
但我不知道如何实现Chan
可以从 1 到 24 然后模式重新开始的事实(即Chan
列可以是 1 到 4,或 1 到 22,或 1 到 17,等等)
当Chan
值恰好为 1 时,通道块实质上开始。我们必须利用此属性来完成任务。
让channel_id
成为一个变量,用唯一的渐进标识符标识每个块。 我们可以这样定义它:
channel_id = (df["Chan"] == 1).cumsum()
其中(df["Chan"] == 1)
在每个块开始的地方创建一个带有True
的掩码,然后cumsum
完成在块上传播标识符并在每次新块开始时增加它的工作。
现在我们只需根据此标识符进行group by
并取Pick
列的平均值:
df.groupby(channel_id)["Pick"].mean()
您可以在一行中完成所有操作而无需补充变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.