如何找到序列中每个交付的平均分数?
Posted
技术标签:
【中文标题】如何找到序列中每个交付的平均分数?【英文标题】:How can I find the average score of each delivery within a sequence? 【发布时间】:2022-01-20 12:17:55 【问题描述】:score
是每次交付收到的分数,runs
是分数的累积。 sequence
是length/type
的 6 个传递顺序,每个结束。我试图在整个数据集中的一个序列中找到每个交付的平均分数以及一个序列的平均运行次数。
使用此代码我得到了类似的结果,但问题是每个length/type
在分组时不会重复,因此平均值的累积,runs
不是正确的 6 球总数:
df_seq=df_seq.reset_index()
df_sq = df_seq.groupby(['sequence', 'length/type']).agg('score':'mean')
df_sq['runs']=df_sq.groupby(['sequence'])['score'].cumsum()
df_sq
这是带有索引重置的原始数据框to_dict
:
'Event_name': 0: 'fulham',
1: 'fulham',
2: 'fulham',
3: 'fulham',
4: 'fulham',
5: 'fulham',
6: 'fulham',
7: 'fulham',
8: 'fulham',
9: 'fulham',
10: 'fulham',
11: 'fulham',
'Batfast_id': 0: 'bfs00200002',
1: 'bfs00200002',
2: 'bfs00200002',
3: 'bfs00200002',
4: 'bfs00200002',
5: 'bfs00200002',
6: 'bfs00200002',
7: 'bfs00200002',
8: 'bfs00200002',
9: 'bfs00200002',
10: 'bfs00200002',
11: 'bfs00200002',
'Session_no': 0: 1,
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
'Overs': 0: 0,
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
'Deliveries_faced': 0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 6,
7: 7,
8: 8,
9: 9,
10: 10,
11: 11,
'score': 0: 0.0,
1: 0.0,
2: 0.0,
3: 0.0,
4: 6.0,
5: 4.0,
6: 0.0,
7: 0.0,
8: 0.0,
9: 0.0,
10: 0.0,
11: 0.0,
'runs': 0: 0.0,
1: 0.0,
2: 0.0,
3: 0.0,
4: 6.0,
5: 10.0,
6: 10.0,
7: 10.0,
8: 10.0,
9: 10.0,
10: 10.0,
11: 10.0,
'delivery_type': 0: 'Extra Slow Leg Spin',
1: 'Extra Slow Leg Spin',
2: 'Slow Straight',
3: 'Extra Slow Off Spin',
4: 'Extra Slow Leg Spin',
5: 'Extra Slow Leg Spin',
6: 'Extra Slow Off Spin',
7: 'Extra Slow Off Spin',
8: 'Slow Straight',
9: 'Extra Slow Leg Spin',
10: 'Extra Slow Off Spin',
11: 'Extra Slow Off Spin',
'length': 0: 'Yorker',
1: 'Yorker',
2: 'Yorker',
3: 'Yorker',
4: 'Yorker',
5: 'Yorker',
6: 'Yorker',
7: 'Yorker',
8: 'Yorker',
9: 'Yorker',
10: 'Yorker',
11: 'Yorker',
'length/type': 0: 'ES_LS_Y',
1: 'ES_LS_Y',
2: 'S_S_Y',
3: 'ES_OS_Y',
4: 'ES_LS_Y',
5: 'ES_LS_Y',
6: 'ES_OS_Y',
7: 'ES_OS_Y',
8: 'S_S_Y',
9: 'ES_LS_Y',
10: 'ES_OS_Y',
11: 'ES_OS_Y',
'sequence': 0: 'ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y',
1: 'ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y',
2: 'ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y',
3: 'ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y',
4: 'ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y',
5: 'ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y',
6: 'ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y',
7: 'ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y',
8: 'ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y',
9: 'ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y',
10: 'ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y',
11: 'ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y'
下面是一个完美的例子,因为数据集中这个序列只有 2 次:
我试图从这个序列中得到的结果是每次交付的平均分数,累积平均数如下:
score runs
sequence length/type
ES_LS_F,ES_LS_F,ES_LS_F,ES_LS_F,ES_LS_F,ES_LS_F ES_LS_F 0.0 0.0
ES_LS_F 2.0 2.0
ES_LS_F 0.0 2.0
ES_LS_F 0.0 2.0
ES_LS_F 2.0 4.0
ES_LS_F 0.0 4.0
即第一次交付的score
将是(0+0)/2 = 0
。第二个是(0+4)/2 = 2
等等。 runs
是这个的累积。当前的解决方案是 (4+4)/12
给每次交付的平均分 0.67,这是不正确的。
df_reg['sequence'] = (df_reg.groupby(["Event_name", "Batfast_id", "Session_no", "Overs"])["length/type"]
.apply(lambda x: ",".join(x)).loc[lambda x: x.str.count(",") == 5]
)
如果我能够按顺序对每个交付进行唯一编号,我将能够做到。
【问题讨论】:
重置索引,groupby(['sequence', 'length/type']), agg('mean')。如果您向数据框构造函数提供示例数据,我可以向您展示。 @PatrykKowalski 我尝试了类似的方法,但出现了问题。请查看问题中的详细信息。我还添加了数据的“to_dict”样本 @PatrykKowalski 您需要更多信息吗? 经过考虑,我不明白你想要完成什么,或者你如何得到你想要的结果。 ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y / ES_LS_Y的平均分是2.5,而不是2。为什么在结果中重复了两次,得分2,然后得分3? @PatrykKowalski 你是对的,我已经将示例屏幕抓取更改为准确。请注意,尽管该示例不是真实结果,但只是我希望它看起来像的示例。我想要序列中每个交付的平均分数,但要显示任何重复的“长度/类型”,以便我可以得到所有平均分数的累积总和以获得总分,这就是“运行”列是。我不想要结束的平均分。 【参考方案1】:这里的问题不是很清楚,但我会试一试。 首先,您要确定序列、长度/类型的平均值。
df_grp = df.groupby(['sequence', 'length/type'])[['score']].mean()
然后将这些计算添加到您的原始结构中
df2 = df.set_index(['sequence', 'length/type'])
df2 = df2[[]].merge(df_grp, left_index=True, right_index=True)
这让我们明白了:
score
sequence length/type
ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y ES_LS_Y 2.5
ES_LS_Y 2.5
ES_LS_Y 2.5
ES_LS_Y 2.5
ES_OS_Y 0.0
S_S_Y 0.0
ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y ES_LS_Y 0.0
ES_OS_Y 0.0
ES_OS_Y 0.0
ES_OS_Y 0.0
ES_OS_Y 0.0
S_S_Y 0.0
现在您只需要计算每个序列的累积和即可。
df2_runs = df2.groupby(df2.index)[['score']].cumsum().rename(columns="score" : "runs")
df2['runs'] = df2_runs.runs
最终结果是
score runs
sequence length/type
ES_LS_Y,ES_LS_Y,S_S_Y,ES_OS_Y,ES_LS_Y,ES_LS_Y ES_LS_Y 2.5 2.5
ES_LS_Y 2.5 5.0
ES_LS_Y 2.5 7.5
ES_LS_Y 2.5 10.0
ES_OS_Y 0.0 0.0
S_S_Y 0.0 0.0
ES_OS_Y,ES_OS_Y,S_S_Y,ES_LS_Y,ES_OS_Y,ES_OS_Y ES_LS_Y 0.0 0.0
ES_OS_Y 0.0 0.0
ES_OS_Y 0.0 0.0
ES_OS_Y 0.0 0.0
ES_OS_Y 0.0 0.0
S_S_Y 0.0 0.0
【讨论】:
感谢您的回答,很抱歉不清楚。我在第 2 步遇到问题。它抛出了这个错误:TypeError: ' 您的源数据中很可能存在一些缺失值。缺失值被解释为浮点数。在这种情况下,您需要先处理丢失的数据。 您可以检查解决方案是否适用于您提供的数据样本 - 然后我们可以确定问题出在不同的数据上 当您将第三步中的 groupby 更改为“sequence”而不是 df2.index 时,它会起作用。但是,当一个序列中的每个交付都相同时,它会重复超过 6 次。我已经在问题中给出了这个问题的快照 按索引分组是指按序列、长度/类型分组,和你做的不一样。这就是导致合并时重复的原因。您显然在长度/类型列中缺少数据。以上是关于如何找到序列中每个交付的平均分数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Power BI 从平均值中找到 Measure 中每个值的 z 分数?