我有两个数据框:
df1(游戏中发生的每个事件对应一行)
日期 | 游戏 | 事件类型 | 玩家 | 时间 |
---|---|---|---|---|
02/28/10 | 美国对加拿大 | 对峙 | 西德尼·克罗斯比 | 20:00 |
02/28/10 | 美国对加拿大 | 通过 | 德鲁·道蒂 | 19:59 |
02/28/10 | 美国对加拿大 | 通过 | 斯科特·尼德迈尔 | 19:42 |
02/28/10 | 美国对加拿大 | 拍摄 | 西德尼·克罗斯比 | 18:57 |
02/28/10 | 美国对加拿大 | 外卖 | 丹妮·希特利 | 18:49 |
02/28/10 | 美国对加拿大 | 拍摄 | 丹妮·希特利 | 18:02 |
02/28/10 | 美国对加拿大 | 拍摄 | 西德尼·克罗斯比 | 17:37 |
df2
玩家 |
---|
西德尼·克罗斯比 |
丹妮·希特利 |
斯科特·尼德迈尔 |
德鲁·道蒂 |
如何在 df2 中创建一个与每个数据框中的 Player 列匹配的新列,并计算 df1 中事件类型为“Shot”的每一行?
这是我在这个例子中要寻找的输出:
玩家 | 镜头 |
---|---|
西德尼·克罗斯比 | 2 |
丹妮·希特利 | 1 |
斯科特·尼德迈尔 | 0 |
德鲁·道蒂 | 0 |
我是 Python 新手,所以如果我遗漏了一个简单的答案,我深表歉意。谢谢!
答案 0 :(得分:1)
您可以为 df1
过滤 shot
,然后进行值计数:
shots = df1.loc[df1['Event Type']=='shot', 'Player'].value_counts()
df2['shots'] = df2['Player'].map(shots)
# or using reindex with `fill_value` option
# shots.reindex(df2['Player'], fill_value=0).values
奖励:使用 crosstab
和 merge
一次性获取所有统计信息:
df2.merge(pd.crosstab(df1['Player'], df1['Event Type']),
on='Player', how='left')