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

W先生

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

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

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

似乎agglambda函数应用于每一列,当应用于每一列时,整个组将是可见的,这导致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. 因此,实际上什么也没做。(我相信你应该sort_values才去groupbyagg,而不是内部agg func

  2. 指定你想要aggstatuscol,而不是所有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)})

或者

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

#same as 
df.groupby(['identifier']).status.agg(myfunc) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 pandas 的 groupby 和 agg 合并包含字典的列

Python Pandas:使用groupby()和agg()时是否保留顺序?

新列中的Pandas groupby和agg值

Pandas groupby agg 根据一列的值

python pandas,DF.groupby()。agg(),agg()中的列引用

groupby和agg by多列错误

python pandas加权平均使用groupby agg()

使用pandas GroupBy.agg()对同一列进行多次聚合

在 Pandas 中处理大型数据框和 groupby/agg

带有 agg() nth() 和/或 iloc() 的 Python Pandas groupby

Pandas groupby 和自定义 agg lambda 函数

Pandas groupby 适用于一列并保留其他列

当groupby和agg在同一列上时,列顺序更改

pandas groupby:我可以通过一列MultiIndex来选择agg函数吗?

在针对分类列的groupby()。agg()操作期间,如何在Pandas和Pyspark中获得相同的结果?

groupby 和 agg 后的行数

pandas groupby agg 从一列获取最大值并从另一列带来值

同时使用 Pandas agg 和 listagg

使用groupby和mean()在Pandas中保留带有分类变量的列

使用agg的pandas groupby无法在多列上使用

使用agg求和并应用列表的Groupby MultiIndex Pandas系列

使用groupby和agg后应用聚合函数

GroupBy 每周在 Pandas 和其他列中计数

Pandas:如何在關於索引的 groupby.agg() 操作之後保留分類列?

pandas 使用 groupby 和另一列值添加列条件

通过pandas.groupby.agg循环时如何忽略单词的其他实例?

Spark 中的嵌套 groupBy 和 agg

熊猫groupby和agg按条件

Agg和groupby按特定条件