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)