Поиск значений в pandas фрейме данных - PullRequest
1 голос
/ 19 февраля 2020
Date        Ticker    Volume
2019-03-21    AAPL        10
2019-03-21    GOOG         5
2019-03-21     IBM         0
2019-03-25    AAPL         0
2019-03-25     IBM         0
2019-03-25    GOOG        12
2019-03-27    AAPL         0
2019-03-27     IBM        16
2019-03-27    GOOG        10
2019-03-28     IBM         9
2019-03-28    GOOG         0
2019-03-28    AAPL        10

Предположим, данные упорядочены по дате. Как точный первый ряд от каждой даты. Если «Громкость» равна 0, возьмите следующую строку, пока она не станет 0.

Date        Ticker    volume
2019-03-21    AAPL        10
2019-03-25    GOOG        12
2019-03-27     IBM        16
2019-03-28     IBM         9

Я пробовал использовать лямбду, но, похоже, не работает.

df_new = df.groupby(['Date']).head(lambda x: 2 if df['Volume'] == 0 else 1).reset_index(0, drop=True)

TypeError: unorderable types: int() < function()

Если у меня достаточно данных и мне нравится получать # 2-5 строк (подряд) от каждой даты. Должен ли я использовать функцию диапазона?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Используйте boolean indexing с маской на Series.ne для неравных и затем DataFrame.drop_duplicates:

df = df[df['Volume'].ne(0)].drop_duplicates('Date')
print (df)
         Date Ticker  Volume
0  2019-03-21   AAPL      10
5  2019-03-25   GOOG      12
7  2019-03-27    IBM      16
9  2019-03-28    IBM       9

Альтернативный с DataFrame.query:

df = df.query('Volume != 0').drop_duplicates('Date')

РЕДАКТИРОВАТЬ:

Для извлечения второго / третьего / следующего столбцов используйте GroupBy.nth, только python считает от 0, поэтому для вторых строк нужно 1, для третьих 2:

df1 = df[df['Volume'].ne(0)]
print (df1)
          Date Ticker  Volume
0   2019-03-21   AAPL      10
1   2019-03-21   GOOG       5
5   2019-03-25   GOOG      12
7   2019-03-27    IBM      16
8   2019-03-27   GOOG      10
9   2019-03-28    IBM       9
11  2019-03-28   AAPL      10

df2 = df1.groupby('Date').nth(1)
print (df2)
           Ticker  Volume
Date                     
2019-03-21   GOOG       5
2019-03-27   GOOG      10
2019-03-28   AAPL      10

или GroupBy.cumcount для маски:

df2 = df1[df1.groupby('Date').cumcount().eq(1)]
print (df2)
          Date Ticker  Volume
1   2019-03-21   GOOG       5
8   2019-03-27   GOOG      10
11  2019-03-28   AAPL      10
1 голос
/ 19 февраля 2020

Использование drop_duplicates

df1=df.loc[df.Volume!=0].drop_duplicates('Date')
Out[13]: 
         Date Ticker  Volume
0  2019-03-21   AAPL      10
5  2019-03-25   GOOG      12
7  2019-03-27    IBM      16
9  2019-03-28    IBM       9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...