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