为了账号安全,请及时绑定邮箱和手机立即绑定

创建一个函数以根据 Pandas 数据帧和标签中的列执行分组和排序

创建一个函数以根据 Pandas 数据帧和标签中的列执行分组和排序

慕田峪4524236 2021-07-02 10:49:35
import pandas as pdimport numpy as npdf = pd.DataFrame([[100,     'm1',   1, 4],[200,     'm2',   7, 5], [120,     'm1',   4, 4],[240,     'm2',   8, 5],[300,     'm3',   5, 4],[330,     'm3',   2, 4],[350,     'm3',   11, 4],[200,     'm4',    9, 4]],columns=['Col1',  'Col2',   'Col3', 'Col4'])我想根据 Col2 组将数据分为两组。但是,第一个匹配项应分配一个值,其余匹配项应分配一个不同的值。Rahlf 帮我创建了一个函数def my_function(x, val):    if x.shape[0]==1:        if x.iloc[0]>val:            return 'high'        else:            return 'low'    if x.iloc[0]>val and any(i<=val for i in x.iloc[1:]):        return 'high'    elif x.iloc[0]>val:        return 'med'    elif x.iloc[0]<=val:        return 'low'    else:        return np.nan然后做df['Col5'] = df.sort_values(['Col2','Col1']).groupby('Col2')['Col3'].transform(my_function, (4))但是,我需要对该函数进行两次修改。而不是 val,它将从 Col 4 中获取相应的值,然后返回一个值(如“low”到组内的第一个匹配项(基于已排序的 col1),然后对其余部分说“low_red”组内比赛。所以我的问题是如何修改函数来做到这一点?
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您可以创建一个my_function()由调用的更高级别的函数(我们称之为),transform()然后调用一个较低级别的函数(我们称之为deeper_logic()),该函数应用您的问题中概述的先前逻辑,如下所示:


def my_function(group):


    val = df.iloc[group.index]['Col4']


    value = deeper_logic(group.iloc[0], val.iloc[0], group)


    return [value if i==0 else value + '_red' for i in range(group.shape[0])]


def deeper_logic(x, val, group):


    if group.shape[0]==1:

        if x>val:

            return 'high'

        else:

            return 'low'


    if x>val and any(i<=val for i in group.iloc[1:]):

        return 'high'

    elif x>val:

        return 'med'

    elif x<=val:

        return 'low'

    else:

        return np.nan


df['Col5'] = df.sort_values(['Col2','Col1']).groupby('Col2')['Col3'].transform(my_function)

这产生:


   Col1 Col2  Col3  Col4      Col5

0   100   m1     1     4       low

1   200   m2     7     5       med

2   120   m1     4     4   low_red

3   240   m2     8     5   med_red

4   300   m3     5     4      high

5   330   m3     2     4  high_red

6   350   m3    11     4  high_red

7   200   m4     9     4      high

请注意,transform()对系列进行操作并返回一个类似索引的 NDFrame,这是我们想要的结果(即保留原始数据帧的索引)。因此,我们可以transform()使用我们的Col3列调用,然后在Col4从iloc调用的函数中使用从原始索引中提取相应的列值transform()。


查看完整回答
反对 回复 2021-07-13
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信