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'])