Python相当于R的seq_len,切片,在哪里?



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

最新更新