Python 3.x 如何聚合数据帧,使变量的值对应于aggfunc中选择的变量行?

Python 3.x 如何聚合数据帧,使变量的值对应于aggfunc中选择的变量行?,python-3.x,pandas,aggregate,Python 3.x,Pandas,Aggregate,我有以下数据 ID DATE AGE COUNT 1 Nat 16 1 1 2021-06-06 19 2 1 2020-01-05 20 3 2 Nat 23 3 2 Nat 16 3 2 2019-02-04 36

我有以下数据

ID        DATE        AGE        COUNT
1         Nat         16         1
1         2021-06-06  19         2
1         2020-01-05  20         3
2         Nat         23         3
2         Nat         16         3
2         2019-02-04  36         12
我希望将其聚合,以便
日期
将是最早的有效日期(在时间上),而
年龄
将从选择最早日期的对应行中提取。输出应该是

ID        DATE        AGE        COUNT
1         2021-06-06  19         1
2         2019-02-04  36         3
给出此错误的我的代码
TypeError:必须提供'func'或命名聚合**kwargs.

df_agg = pd.pivot_table(df, index=['ID'],
                                values=['DATE', 'AGE'],
                                aggfunc={'DATE': np.min, 'AGE': None, 'COUNT': np.min})
我不想使用“年龄”:np.min,因为对于ID=1,将提取年龄=16,这不是我想要的

/////////////编辑///////////////

所做的编辑提供了一个更通用的示例。

您可以尝试:

印刷品:

ID日期年龄
1   1 2021-06-06   19
5   2 2019-02-04   36

编辑:使用
.pivot\u table()
。您可以将
“日期”
/
“年龄”
提取为一个列表,对于
“计数”
,您可以使用
np.min
“min”
。第二步是将
“日期”
/
“年龄”
列表分解为单独的列:

df_agg = pd.pivot_table(
    df,
    index=["ID"],
    values=["DATE", "AGE", "COUNT"],
    aggfunc={
        "DATE": lambda x: df.loc[x.first_valid_index()][
            ["DATE", "AGE"]
        ].tolist(),
        "COUNT": "min",
    },
)
df_agg[["DATE", "AGE"]] = pd.DataFrame(df_agg["DATE"].apply(pd.Series))
print(df_agg)
印刷品:

计数日期年龄
身份证件
1       1 2021-06-06   19
2       3 2019-02-04   36

您可以对值进行排序并删除重复项(排序索引是可选的)


使用
groupby
transform

df[df['DATE'] == df.groupby("ID")['DATE'].transform('min')]

假设您有一个索引,一个简单的解决方案是:

def min_val(group):
    group = group.loc[group.DATE.idxmin]
    return group

df.groupby(['ID']).apply(min_val)
如果没有索引,可以使用:

df.reset_index().groupby(['ID']).apply(min_val).drop(columns=['ID'])

谢谢,这绝对解决了当前的问题。但是我想知道是否还有一种方法可以使用
pivot\u表
groupby
函数。这样,我可以选择正确的日期并提取相应的人口统计变量,但也可以提取其他变量的平均值/最小值/最大值(如果需要)。@KubiK888我使用
.pivot\u table()更新了我的答案
我收到此错误
AttributeError:“DataFrame”对象没有属性“tolist”
@KubiK888您使用的是什么版本?您可以使用
.values.tolist()
而不是
.tolist()
df[df['DATE'] == df.groupby("ID")['DATE'].transform('min')]
def min_val(group):
    group = group.loc[group.DATE.idxmin]
    return group

df.groupby(['ID']).apply(min_val)
df.reset_index().groupby(['ID']).apply(min_val).drop(columns=['ID'])