一道Pandas题目:求和相关
分享一道关于pandas分组求和的题目。
模拟数据
In [1]:
1 | import pandas as pd |
In [2]:
1 | df = pd.DataFrame({"col":list("ABCDABCABAD"), |
数据特点与需求
In [4]:
1 | (df.sort_values(["col","number"], |
特点
根据字段col进行分组可以看到字段number的特点:
- A的取值全部存在且大于0
- B的取值存在0和NaN,也存在大于0的数值
- C的取值有0和NaN
- D的取值全部为NaN
需求
根据ABCD分组,求出每个取值对应的和:
- 如果全部为空,则和为空(D)
- 如果存在数值和空值,则排除空值再求和(BC)
- 如果全部为数值,直接求和(A)
错误方法
1 | #df["total"] = df.groupby("col")["number"].transform(sum) |
直接使用transform方法,求和只有一个问题:分组的D中全部是空值,但是求和却是0。
想要的结果的是:结果仍是空值NaN。
解法:
使用多个函数解决了:isnull + groupby + concat + drop_dumplictes + merge
需要区分空值和非空值
非空值部分
In [7]:
先把非空值的数据取出来:
1 | df1 = df[df["number"].isnull() == False] |
对上面的数据分组再求和:
1 | df3 = (df1.groupby("col")["number"] |
空值部分
从df中取出空值部分:
1 | df2 = df[df["number"].isnull() == True] |
对上面的数据根据col字段进行去重:
1 | df2.drop_duplicates("col", inplace=True) |
concat合并
同时存在空值和非空值的BC会出现两次:
去重保留第一次出现的数据:
merge合并
将上面的结果df4和原数据df,根据字段col进行合并: