Python 熊猫从多个观测值中选择最大值来创建新的数据帧

Python 熊猫从多个观测值中选择最大值来创建新的数据帧,python,pandas,subset,Python,Pandas,Subset,我想根据列的最大值创建一个新的数据帧。但是,我有来自同一受访者的多个观察结果,我只想从每个受访者的value1列中选择最大值。 下面是一个简化的示例: df: 以下是我想要的结果: 新发展基金: respondent value1 value2 0 1 5 34 1 2 9 54 2 3 3 21 有什么想法吗?以下内容实现了您的愿望,并且似乎比@CT Zhu的

我想根据列的最大值创建一个新的数据帧。但是,我有来自同一受访者的多个观察结果,我只想从每个受访者的value1列中选择最大值。 下面是一个简化的示例:

df:

以下是我想要的结果:

新发展基金:

  respondent  value1  value2
0           1       5      34
1           2       9      54
2           3       3      21

有什么想法吗?

以下内容实现了您的愿望,并且似乎比@CT Zhu的答案更快:

In [30]:

df.loc[df.groupby('respondent').value1.idxmax().values]
Out[30]:
   respondent  value1  value2
1           1       5      34
5           2       9      54
8           3       3      21
In [31]:

%timeit df.loc[df.groupby('respondent').value1.idxmax().values]
%timeit df[df.groupby('respondent').value1.transform(lambda x: x==x.max())]
%timeit df.sort(['respondent', 'value1'], ascending=[1,0]).groupby('respondent').head(1)
100 loops, best of 3: 1.76 ms per loop
100 loops, best of 3: 2.99 ms per loop
100 loops, best of 3: 4.42 ms per loop

此外,上述内容是在pandas版本0.12.0 64位上使用python 3.3实现的,很高兴知道第二个解决方案比第一个慢得多+1@jonas始终值得检查不同的方法通常使用
loc
和numpy函数是无法克服的
In [30]:

df.loc[df.groupby('respondent').value1.idxmax().values]
Out[30]:
   respondent  value1  value2
1           1       5      34
5           2       9      54
8           3       3      21
In [31]:

%timeit df.loc[df.groupby('respondent').value1.idxmax().values]
%timeit df[df.groupby('respondent').value1.transform(lambda x: x==x.max())]
%timeit df.sort(['respondent', 'value1'], ascending=[1,0]).groupby('respondent').head(1)
100 loops, best of 3: 1.76 ms per loop
100 loops, best of 3: 2.99 ms per loop
100 loops, best of 3: 4.42 ms per loop