python - 获取一列的值,其中一列为最大值,另一列为最小值

标签 python pandas dataframe

来自这样的数据框

import pandas as pd
import numpy as np

df = pd.DataFrame({
            'col1': ['a'] * 20 + ['b'] * 20,
            'col2': (['c'] * 10 + ['d'] * 10)*2,
            'col3': ( ['x'] * 3 + ['y'] * 7)*4,
            'col4': np.random.rand(40),
            'col5': np.random.rand(40),
            }
            )

我想获取“col3”的值,其中“col4”最大,如果有两行或更多行具有相同的“col4”值,请选择“col5”最小的行。

dg = df.groupby(('col1', 'col2'), sort=False)['col4'].max()
dh = df.groupby(('col1', 'col2'), sort=False)['col5'].min()

到目前为止我已经想出了这个,

dg = df.groupby(('col1', 'col2'), sort=False)\
        .agg({'col4':'max', 'col5':'min'})

但它独立地给了我最大“col4”和最小“col5”,而我希望“col5”值是与最大“col4”对应的值(如果只有一个“col4”最大行) .

此外,我希望“col3”值与最大“col4”相对应。我现在有这个:

df.loc[df.groupby(('col1', 'col2'), sort=False)['col4'].idxmax()]['col3'].reset_index()['col3']

这给了我我想要的列,但是当我将它放入新的数据框中时,我没有得到我所期望的,这将是最大“col4”和最小“col5”以及它们相应的“col3”值:

dg['col3'] = df.loc[df.groupby(('col1', 'col2'), sort=False)['col4'].idxmax()]['col3'].reset_index()['col3']

示例:

import numpy as np
import pandas as pd

np.random.seed(2020)
df = pd.DataFrame({ 'col1': ['a'] * 10 + ['b'] * 10, 'col2': (['c'] * 5 + ['d'] * 5)*2, 'col3': ( ['x'] * 5 + ['y'] * 5)*2, 'col4': np.random.randint(5, size=20), 'col5': np.random.randint(5, size=20), } )
   col1 col2 col3  col4  col5
0     a    c    x     0     4
1     a    c    x     0     1
2     a    c    x     3     1
3     a    c    x     3     2
4     a    c    x     3     1
5     a    d    y     3     2
6     a    d    y     0     4
7     a    d    y     0     4
8     a    d    y     0     2
9     a    d    y     0     3
10    b    c    x     2     4
11    b    c    x     1     1
12    b    c    x     3     4
13    b    c    x     3     1
14    b    c    x     2     3
15    b    d    y     3     2
16    b    d    y     0     0
17    b    d    y     4     1
18    b    d    y     4     1
19    b    d    y     0     2

预期输出为:

   col1 col2 col3  col4  col5
     a    c    x     3     1
     a    c    x     3     1
     a    d    y     3     2
     b    c    x     3     1
     b    d    y     4     1
     b    d    y     4     1

最佳答案

用途:

np.random.seed(2020)
df = pd.DataFrame({ 'col1': ['a'] * 10 + ['b'] * 10, '
                   col2': (['c'] * 5 + ['d'] * 5)*2, 
                   'col3': ( ['x'] * 5 + ['y'] * 5)*2, 
                   'col4': np.random.randint(5, size=20), 
                   'col5': np.random.randint(5, size=20), } )
print (df)
   col1 col2 col3  col4  col5
0     a    c    x     0     4
1     a    c    x     0     1
2     a    c    x     3     1
3     a    c    x     3     2
4     a    c    x     3     1
5     a    d    y     3     2
6     a    d    y     0     4
7     a    d    y     0     4
8     a    d    y     0     2
9     a    d    y     0     3
10    b    c    x     2     4
11    b    c    x     1     1
12    b    c    x     3     4
13    b    c    x     3     1
14    b    c    x     2     3
15    b    d    y     3     2
16    b    d    y     0     0
17    b    d    y     4     1
18    b    d    y     4     1
19    b    d    y     0     2

首先用 boolean indexing 过滤所有行通过最大 col4 通过 GroupBy.transform并将 col4Series.eq 进行比较


df1 = df[df.groupby(['col1', 'col2'])['col4'].transform('max').eq(df['col4'])]
print (df1)
   col1 col2 col3  col4  col5
2     a    c    x     3     1
3     a    c    x     3     2
4     a    c    x     3     1
5     a    d    y     3     2
12    b    c    x     3     4
13    b    c    x     3     1
17    b    d    y     4     1
18    b    d    y     4     1

#if need only some columns filter by list
cols = ['col1','col2','col3', 'col4','col5']
mask = df1.groupby(['col1', 'col2'], sort=False)['col5'].transform('min').eq(df1['col5'])
df2 = df1.loc[mask, cols]
print (df2)
   col1 col2 col3  col4  col5
2     a    c    x     3     1
4     a    c    x     3     1
5     a    d    y     3     2
13    b    c    x     3     1
17    b    d    y     4     1
18    b    d    y     4     1

关于python - 获取一列的值,其中一列为最大值,另一列为最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60056611/

相关文章:

python - 如何将 HTML 文件从我的 python 推送回网页

python - 为什么某些数据框数学函数花费更多时间?如何加快它们的速度?

pandas - 如何检查 pandas 数据框中一列对另一列的依赖关系

python - 合并多个数据帧并对值求和

python - Pandas DataFrame 按分类列排序,但按特定类排序

python - Python 3.6 和 Python 3.5 中字典顺序的区别

python - 我们如何根据不同的数据集预测新数据的目标值? scikit 学习/gaussianNB

python - 用可调用实例装饰类函数

python - 如何在 Python 中无循环地有条件地设置 DataFrame 列值

python - 在 groupby 之后取回 Pandas DataFrame 中的数据