Python 保留一列,但在Groupby和Agg中使用其他列

Python 保留一列,但在Groupby和Agg中使用其他列,python,pandas,Python,Pandas,我的目标是按特定列(标识符)对数据集进行分组,然后执行一些自定义操作(首先按日期排序,然后连接状态) 以下是我迄今为止所做的工作 import pandas as pd from io import StringIO text = """date identifier status 1/1/18 A Pending 1/1/18 B Pending 1/1/18 C Pending 1/2/18 A Approve 1/2/18 B Pending 1/2/18

我的目标是按特定列(标识符)对数据集进行分组,然后执行一些自定义操作(首先按日期排序,然后连接状态)

以下是我迄今为止所做的工作

import pandas as pd
from io import StringIO
text = """date  identifier  status
1/1/18  A   Pending
1/1/18  B   Pending
1/1/18  C   Pending
1/2/18  A   Approve
1/2/18  B   Pending
1/2/18  C   Pending
1/3/18  B   Approve
1/3/18  C   Pending"""
text = StringIO(text)
df = pd.read_csv(text, sep="\t") 

# group by identifier 
# within the group, sort by date
# then concatenate by status

def myfunc(df):
    df.sort_values(by="date", ascending=True)
    res = [s[0] for s in df['status']]
    return ''.join(res)

df.groupby(['identifier']).agg(lambda x: myfunc(x))

id  date  status        
A   PA  PA
B   PPA PPA
C   PPP PPP
似乎
agg
会将
lambda
函数应用于每一列,当应用于每一列时,整个组都将可见,从而导致
状态
日期
出现在最终结果中并共享相同的输出我可以在之后删除日期列,但似乎并不理想

我试图指定status列,然后您将无法看到要包含的其他列(用于排序)

总之,我应该如何正确使用agg函数来获得最终结果

id   status        
A    PA
B    PPA
C    PPP

IIUC,您可以先进行切片,然后只进行
agg

df['letter'] = df.status.str[0]
df.groupby('identifier').letter.agg(''.join)

identifier
A     PA
B    PPA
C    PPP

但是,如果您真的想使用
myfunc
,您可以通过执行以下操作来更正

  • 重新分配
    排序\u值
    (或完全删除):按照现在的方式,您正在排序,但不使用
    排序\u值的返回值
    。因此,实际上什么也没有做。(我认为在使用
    groupby
    agg
    之前,您应该对值进行
    排序,而不是在
    agg func

  • 指定要
    agg
    status
    col,而不是所有col。您可以通过两种方式来完成,如下所示

  • 代码如下所示:

    def myfunc(ser):
        res = [s[0] for s in ser]
        return ''.join(res)
    
    df = df.sort_values('date', ascending=True)
    df.groupby(['identifier']).agg({'status': lambda x: myfunc(x)})
    


    分组后,如何按日期排序,但要连接状态?代码的后半部分是按状态排序,而不是按日期排序。@B.Mr.W.true。在一切工作开始之前,只需执行
    df.sort_values(by='date')
    ,我想我是否真的想指定在聚合期间使用哪些列,并且对输出的列也很挑剔,我可能不得不在分组对象中循环,而不是直接使用agg。
    def myfunc(ser):
        res = [s[0] for s in ser]
        return ''.join(res)
    
    df = df.sort_values('date', ascending=True)
    df.groupby(['identifier']).agg({'status': lambda x: myfunc(x)})
    
    df.groupby(['identifier']).status.agg(lambda x: myfunc(x))
    
    #same as 
    df.groupby(['identifier']).status.agg(myfunc)