Python-эквивалент R seq_len, slice и где? - PullRequest
0 голосов
/ 11 февраля 2019

Переход от 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 голосов
/ 11 февраля 2019

Вы можете индексировать фрейм данных, используя условия ниже:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...