这是我的数据集:
Day Player Score
1 Andy 6
2 Boby 6
3 Andy 4
4 Carl 2
5 Andy 3
这是一个简化的示例,但是基本上我想添加一个新列(“ last_pass_date”),以在“玩家”得分达到5以上时查找上一个索引。
我拥有的是:
df['last_pass_date'] = df.groupby(['Player'])['Day'].shift(1)
但是我不确定如何添加'Score'> 5的附加过滤器。任何帮助将不胜感激。谢谢!
编辑:我的解决方案的输出为[NaN,NaN,'1',NaN,'3'],理想情况下应为[NaN,NaN,'1',NaN,'1'],因为第3行没有满足得分> 5。
答案 0 :(得分:1)
创建passed
列:
df['passed'] = df.Day[df.Score > 5]
按Player
分组,移passed
并向前填充以保留最后通过日期
df['last_pass_date'] = df.groupby('Player').passed.apply(lambda x: x.shift().ffill())
为我产生以下输出:
Day Player Score passed last_pass_date
0 1 Andy 6 1.0 NaN
1 2 Boby 6 2.0 NaN
2 3 Andy 4 NaN 1.0
3 4 Carl 2 NaN NaN
4 5 Andy 3 NaN 1.0
答案 1 :(得分:1)
如何?
df = pd.DataFrame({"Day": [1, 2, 3, 4, 5],
"Player": ["Andy", "Boby", "Andy", "Carl", "Andy"],
"Score": [6, 6, 4, 2, 3],
})
df['last_pass_date'] = None
passed_indices = df["Score"] > 5
df.loc[passed_indices, 'last_pass_date'] = df.loc[passed_indices, 'Day']
df['last_pass_date'] = df.groupby("Player")['last_pass_date'].apply(
lambda group: group.shift().ffill())
print(df)
产生:
Day Player Score last_pass_date
0 1 Andy 6 NaN
1 2 Boby 6 NaN
2 3 Andy 4 1.0
3 4 Carl 2 NaN
4 5 Andy 3 1.0
这个想法是在玩家通过时将last_pass_date设置为当前日期,然后为每个玩家向前填充该列。唯一需要的额外技巧是在向前填充按玩家分组的列之前,先移位1(这样您就可以获得玩家先前通过的通过日期)