Python等效于R的seq_len,slice和位置?

时间:2019-02-11 15:16:44

标签: python numpy

从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的复杂性!

1 个答案:

答案 0 :(得分:1)

您可以使用以下条件为数据框建立索引:

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