gpt4 book ai didi

python - 获取一列最大而另一列最小的列的值

转载 作者:行者123 更新时间:2023-12-04 10:38:19 25 4
gpt4 key购买 nike

从这样的数据帧

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com