来自这样的数据框
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
并将 col4
与 Series.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/