gpt4 book ai didi

python - 在 Pandas Groupby 和 Agg 中保留一列但使用其他列

转载 作者:行者123 更新时间:2023-11-30 22:10:54 25 4
gpt4 key购买 nike

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

这是我到目前为止所做的事情。

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函数应用于每一列,当应用于每一列时,整个组将是可见的,这导致statusdate 出现在最终结果中并共享相同的输出。 我可以稍后删除日期列,但看起来并不理想

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

def myfunc1(x):
print(x)

df.groupby(['identifier']).agg({'status': lambda x: myfunc1(x)})
0 Pending
3 Approve
Name: status, dtype: object
1 Pending
4 Pending
6 Approve
Name: status, dtype: object
2 Pending
5 Pending
7 Pending
Name: status, dtype: object

综上所述,如何正确使用 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,你可以通过这样做来纠正它

  1. 重新分配sort_values(或完全删除它):按照现在的方式,您正在排序,但不使用sort_values的返回值。因此,实际上什么也没做。 (我相信你应该在groupbyagg之前sort_values,而不是在agg func内部。

  2. 指定您要聚合状态列,而不是所有列。您可以通过两种方式做到这一点,如下所示

代码如下:

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)

关于python - 在 Pandas Groupby 和 Agg 中保留一列但使用其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51572393/

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