R过渡到Python,我很难复制以下代码:
df = df %>% group_by(ID) %>% slice(seq_len(min(which(F < 1 & d == 8), n()))
示例数据:
ID Price F D
1 10.1 1 NAN
1 10.4 1 NAN
1 10.6 .8 8
1 8.1 .8 NAN
1 8.5 .8 NAN
2 22.4 2 NAN
2 22.1 2 NAN
2 21.1 .9 8
2 20.1 .9 NAN
2 20.1 .9 6
具有所需的输出:
ID Price F D
1 10.1 1 NAN
1 10.4 1 NAN
2 22.4 2 NAN
2 22.1 2 NAN
我相信python中的代码将包括某种:np.where, cumcount(( 和 slice.
但是,我不知道我将如何做到这一点。任何帮助将不胜感激,谢谢。
编辑:对于将来任何来我的问题并希望找到解决方案的人 - yatu的解决方案工作得很好 - 但我已经努力进入另一个解决方案,我发现它更容易阅读:
df['temp'] = np.where((df['F'] < 1) & (df['D'] == 8), 1, 0)
mask = df.groupby(ID)['temp'].cumsum().eq(0)
df[mask]
我已经阅读了一点关于掩蔽的内容,它确实有助于简化 python 的复杂性!
您可以使用以下条件为数据帧编制索引:
c1 = ~df.Distro.eq(8).groupby(df.ID).cumsum()
c2 = df.Factor.lt(1).groupby(df.ID).cumsum().eq(0)
df[c1 & c2]
ID Price Factor Distro
0 1 10.1 1.0 NAN
1 1 10.4 1.0 NAN
5 2 22.4 2.0 NAN
6 2 22.1 2.0 NAN
请注意,通过取布尔序列的.cumsum
,您实际上是在传播True
值,因此一旦出现True
,剩余的值就会True
。此结果(已取反(可用于在出现值时立即从数据帧中删除行。
详
以下数据帧显示原始数据帧以及用于为其编制索引的条件。在这种情况下,给定指定的条件发生在同一行中,两个条件显示相同的行为:
df.assign(c1=c1, c2=c2)
ID Price Factor Distro c1 c2
0 1 10.1 1.0 NAN True True
1 1 10.4 1.0 NAN True True
2 1 10.6 0.8 8 False False
3 1 8.1 0.8 NAN False False
4 1 8.5 0.8 NAN False False
5 2 22.4 2.0 NAN True True
6 2 22.1 2.0 NAN True True
7 2 21.1 0.9 8 False False
8 2 20.1 0.9 NAN False False
9 2 20.1 0.9 6 False False