【发布时间】: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'}}
我试图从这个序列中得到的结果是每次交付的平均分数,累积平均数如下:
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 你是对的,我已经将示例屏幕抓取更改为准确。请注意,尽管该示例不是真实结果,但只是我希望它看起来像的示例。我想要序列中每个交付的平均分数,但要显示任何重复的“长度/类型”,以便我可以得到所有平均分数的累积总和以获得总分,这就是“运行”列是。我不想要结束的平均分。
标签: python pandas dataframe pandas-groupby sequence