Python Pandas groupby:如何根据Pandas groupby组中另一列的数据选择行后选择相邻列的数据?

Python Pandas groupby:如何根据Pandas groupby组中另一列的数据选择行后选择相邻列的数据?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据库,部分如下所示。对于每个日期,都有持续时间条目(每个日期1-20个),并为每个持续时间列出项目(100个)。每个项在相邻列中都有几个关联的数据点,包括一个标识符。对于每个日期,我要选择最大的持续时间。然后,我想找到一个值最接近给定输入值的项。然后,我想获取该项的ID,以便能够在数据库中跟踪该项的整个时间 Index Date Duration Item Value ID 0 1/1/2018 30 100 4 a 1

我有一个数据库,部分如下所示。对于每个日期,都有持续时间条目(每个日期1-20个),并为每个持续时间列出项目(100个)。每个项在相邻列中都有几个关联的数据点,包括一个标识符。对于每个日期,我要选择最大的持续时间。然后,我想找到一个值最接近给定输入值的项。然后,我想获取该项的ID,以便能够在数据库中跟踪该项的整个时间

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
我认为pandas groupby函数非常适合创建日期/持续时间组:


df=df.groupby('Date')['Duration'].max()#为每个日期创建正确的最大持续时间组
我希望我正确地理解了您,可能有一种更简单、更简单的方法,但以下是我的想法:

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']]

您可以执行以下操作:

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
按照你的逻辑:

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()]

不明白你的第二个命令(没有groupby)结果如何,它没有功能性…此解决方案确实提供了感兴趣的数据。我接受了PMende提供的解决方案,因为它更快,并且在原始数据的值列中包含nan时不会导致空行。我并没有真正研究过最后一个问题,但看到idxmin默认跳过NAN时,我有点惊讶。这个解决方案工作得很好,我已经在我的项目中实现了它。它比Jessica提供的解决方案更快,并且在原始数据的值列中包含NAN时不会导致空行。