Python Pandas groupby:如何根据Pandas groupby组中另一列的数据选择行后选择相邻列的数据?
我有一个数据库,部分如下所示。对于每个日期,都有持续时间条目(每个日期1-20个),并为每个持续时间列出项目(100个)。每个项在相邻列中都有几个关联的数据点,包括一个标识符。对于每个日期,我要选择最大的持续时间。然后,我想找到一个值最接近给定输入值的项。然后,我想获取该项的ID,以便能够在数据库中跟踪该项的整个时间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
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时不会导致空行。