Pandas groupby: как выбрать данные соседнего столбца после выбора строки на основе данных в другом столбце в группах pandas groupby? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть база данных, как частично показано ниже.Для каждой даты есть записи для продолжительности (1-20 за дату), с элементами (100 с), перечисленными для каждой продолжительности.Каждый элемент имеет несколько связанных точек данных в соседних столбцах, включая идентификатор.Для каждой даты я хочу выбрать наибольшую продолжительность.Затем я хочу найти элемент со значением, наиболее близким к заданному входному значению.Затем я хотел бы получить идентификатор для этого элемента, чтобы иметь возможность отслеживать значение этого элемента в течение его времени в базе данных.

Index Date      Duration Item   Value  ID
0     1/1/2018     30     100      4    a
1     1/1/2018     30     200      8    b
2     1/1/2018     30     300     20    c
3     1/1/2018     60     100      9    d
4     1/1/2018     60     200     19    e
5     1/1/2018     60     300     33    f
6     1/1/2018     60     400     50    g
7     1/2/2018     31     100      3    a
8     1/2/2018     31     200      7    b
9     1/2/2018     31     300     20    c
10    1/2/2018     61     100      8    d
11    1/2/2018     61     200     17    e
12    1/2/2018     61     300     30    f

Я подумал, что функция группового панд будет идеальной для создания даты/ длительность группы:

df = df.groupby('Date')['Duration'].max()   #creates the correct groups of max duration for each date

Без группирования данные можно получить, найдя правильную строку, например:

row = df['ID'].index(df['Value'] - target_value).abs().argsort()[:1]]
id = df.loc[row, 'ID']

Но это не работает в групповых группах.Я пытался решить эту проблему с помощью других операций pandas, но не могу понять, как получить данные идентификатора после выбора элемента с правильным значением.Есть много вопросов по SO относительно извлечения данных в определенных столбцах (или применения функций к данным в определенных столбцах) после pandas.groupby, но я ничего не нашел по выбору данных в соседних столбцах.Буду признателен, если вы укажете мне правильное направление.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Вы можете сделать что-то вроде следующего:

target_value = 15
df['max_duration'] = df.groupby('Date')['Duration'].transform('max')
df.query('max_duration == Duration')\
  .assign(dist=lambda df: np.abs(df['Value'] - target_value))\
  .assign(min_dist=lambda df: df.groupby('Date')['dist'].transform('min'))\
  .query('min_dist == dist')\
  .loc[:, ['Date', 'ID']

Результаты:

        Date ID
4   1/1/2018  e
11  1/2/2018  e
0 голосов
/ 21 февраля 2019

по вашей логике:

idx = df.groupby(['Date'])['Duration'].transform(max) == df['Duration']
#tgt_value = 19
d = df[idx]
d['dist']=(d['Value'] - 19).abs()

Row_result = d.loc[d['dist'].idxmin()]
0 голосов
/ 21 февраля 2019

Надеюсь, я вас правильно понимаю, и, возможно, есть более простой и простой способ, но вот мои мысли:

data = [['1/1/2018' ,    30  ,   100    ,  4   , 'a'],
    ['1/1/2018'  ,    30 ,    200  ,    8 ,   'b'],
    ['1/1/2018'  ,   30   ,  300  ,  20  , 'c'],
    ['1/1/2018'  ,   60   ,  100     , 9   , 'd'],
    ['1/1/2018'   ,   60   ,  200     ,19  ,  'e'],
   ['1/1/2018'  ,   60   ,  300     ,33  ,  'f'],
   ['1/1/2018'   ,   60   ,  400     ,50  ,  'g'],
   ['1/2/2018'  ,   31   ,  100     , 3  ,  'a'],
   ['1/2/2018'   ,   31   ,  200    ,  7  ,  'b'],
  ['1/2/2018'  ,   31   ,  300   ,  20   , 'c'],
  ['1/2/2018'  ,   61   ,  100   ,   8   , 'd'],
  ['1/2/2018'  ,   61   ,  200   ,  17  ,  'e'],
  ['1/2/2018'  ,   61   ,  300   ,  30   , 'f']]


df = pd.DataFrame(data=data, columns=['Date','Duration','Item','Value','ID'])

df1 = df.groupby('Date', as_index=False)[['Duration']].max()
df2 = pd.merge(df,df1, how='inner')

#target_value = 19
df2['diff']=(df2.Value-target_value).abs()

result=df2.loc[df2.groupby('Date')['diff'].idxmin()]

В результирующем фрейме данных содержится значение, наиболее близкое к вашему входному значению.,если вам нужен только столбец «ID», тогда

IDresult = result[['ID']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...