如何在Python中分组、排序行数据并将其放入新列中

2024-09-28 15:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

id1   id2    c1   c2
1      a1     5     3
1      a1     6     2
1      a1     9     4
2      b1     5     2
2      b1     23    43
1      a1     34    32
3      3a     234   435

现在我想添加八个新列,如下所示:

c1_max   c2_max   c1_secondMax   c2_secondMax   c1_thirdMax c2_thirdMax   c1_min   c2_min

我想按id1id2分组

我已经添加了c1_max c2_max c1_min c2_min列,如下所示:

features = ["c1","c2"]
maxData = all_data.groupby(['id1','id2'])[features].agg('max')
all_data = pd.merge(all_data, maxData.reset_index(), suffixes=["", "_max"], how='left', on=['id1', 'id2'])

minData= all_data.groupby(['id1','id2'])[features].agg('min')
all_data = pd.merge(all_data, minData.reset_index(), suffixes=["", "_max"], how='left', on=['id1', 'id2'])

但是,如何添加_secondMaxthirdMax。基本上,它们是这些行中的第二个最大值和第三个最大值。你知道吗


Tags: dataa1allminmaxb1featuresid2
2条回答

让我们试试这个:

smax = lambda x: x[x.rank(ascending = False) == 2]
smax.__name__ = 'secondMax'

tmax = lambda x: x[x.rank(ascending = False) == 3]
tmax.__name__ = 'thirdMax'

df_out = df.groupby(['id1','id2']).agg(['max','min',smax, tmax])
df_out.columns = [f'{i}_{j}' for i,j in df_out.columns]
df_out = df.merge(df_out, on=['id1','id2'])
df_out = df_out.where(df_out.astype(bool))
df_out

输出:

   id1 id2   c1   c2  c1_max  c1_min c1_secondMax c1_thirdMax  c2_max  c2_min c2_secondMax c2_thirdMax
0    1  a1    5    3      34       5            9           6      32       2            4           3
1    1  a1    6    2      34       5            9           6      32       2            4           3
2    1  a1    9    4      34       5            9           6      32       2            4           3
3    1  a1   34   32      34       5            9           6      32       2            4           3
4    2  b1    5    2      23       5            5         NaN      43       2            2         NaN
5    2  b1   23   43      23       5            5         NaN      43       2            2         NaN
6    3  3a  234  435     234     234          NaN         NaN     435     435          NaN         NaN

以同样的方式获得maxdatamindata,您可以通过以下操作获得nth最小值和最大值:

df.sort_values(['id1','id2','c1']).groupby(['id1','id2']).c1.nth(1)

      id1  id2
1    a1      6
2    b1     23
Name: c1, dtype: int64

所以在这种情况下,你将得到c1的第二个最小值

其中df.sort_values(['id1','id2','c1'])将分别根据id1id2c1对值进行排序,这相当于按id1id2分组和排序c1

   id1 id2   c1   c2
0    1  a1    5    3
1    1  a1    6    2
2    1  a1    9    4
5    1  a1   34   32
3    2  b1    5    2
4    2  b1   23   43
6    3  3a  234  435

相关问题 更多 >