看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例主要掌握 Pandas 的 agg 方法的使用方法,df.agg 是 Pandas 最为方便的该用函数的方法,只需要传入函数名就行,默认接受第一个参数,不能再指定其他参数。本需求是需要将分组后的多个列表中的元素进行去重。
以下为数据集,a 列为组名,b 列是一个列表:
import pandas as pd
df = pd.DataFrame({
'a': ['x', 'x', 'y'],
'b': [[1, 2, 3], [1, 4], [2, 2, 3]]
})
df
'''
a b
0 x [1, 2, 3]
1 x [1, 4]
2 y [2, 2, 3]
'''
现在需要按 a 列分组,然后将组中的所有列表合并并计算出不重复的值的数量,如以上数据集中,x 组的两个列表中共 5 个元素,其中 1 为重复,因此 x 组不重复的元素为 4。
需求涉及分组,我们就要对数据胺 a 列分组,然后聚合方法为把所有列表拼接到一起,sum 在数字类型是执行加法操作,在列表或者字符操作时执行拼接操作,我们用 agg 来调用 sum 得到列表拼接效果。
拼接完成后我们再用 agg 调用 set 进行去后果,这是利用了集合类型的不重复特性。最后再用 len 计算去重后的长度就是我们要的结果。
首先进行分组,并取 b 列,对 b 列应用 sum,sum 对同组的列表进行拼接:
df.groupby('a').b.agg(sum)
'''
a
x [1, 2, 3, 1, 4]
y [2, 2, 3]
Name: b, dtype: object
'''
再用 agg 调用 set 将列表转为集合类型,此时会去掉重复值:
df.groupby('a').b.agg(sum).agg(set)
'''
a
x {2, 4, 1, 3}
y {2, 3}
Name: b, dtype: object
'''
最后再调用一次 len 计算集合的长度,就得到了我们想要的结果:
(
df.groupby('a')
.b
.agg(sum)
.agg(set)
.agg(len)
)
'''
a
x 4
y 2
Name: b, dtype: int64
'''
上边我们得到了每组不重复值的数量,如果想知道每个值有几个,如何得到这样的一个表格呢?
代码如下:
(
df.groupby('a').b
.apply(sum)
.apply(lambda x: pd.Series(x).value_counts())
.fillna(0)
.astype(int)
)
# 或者
(
df.groupby('a').b
.apply(sum)
.map(pd.Series)
.apply(pd.Series.value_counts)
.fillna(0)
.astype(int)
)
'''
1 2 3 4
a
x 2 1 1 1
y 0 2 1 0
'''
这个表格的值代表了每个分组(行索引)对个值(列索引)的数量。
(完)
更新时间:2024-08-18 15:37:25 标签:pandas python 重复值