九天猎人 发表于 2023-8-29 18:40:35

【pandas小技巧】--统计值作为新列

这次介绍的小技巧不是统计,而是把统计结果作为新列和原来的数据放在一起。
pandas的各种统计功能之前已经介绍了不少,但是每次都是统计结果归统计结果,原始数据归原始数据,
没有把它们合并在一个数据集中来观察。
下面通过两个场景示例来演示如果把统计值作为新列的数据。
1. 成绩统计的场景

成绩统计及其类似的场景比较常见,也就是把每行统计的结果作为该行的一个新列。
比如:
import pandas as pd
import numpy as np

df = pd.DataFrame(
    np.random.randint(60, 100, (4, 3))
)
df.columns = ["语文", "数学", "英语"]
df.index = ["学生"+s for s in list("ABCD")]
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684374098889-e990936d-862f-4c8e-be87-a98166b8288d.png#averageHue=%23e6e6e6&clientId=u636fbd4c-2335-4&from=paste&height=174&id=uf88bea20&originHeight=174&originWidth=214&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7530&status=done&style=stroke&taskId=u7b5b73e6-77a6-48e4-81ed-0d44c93975a&title=&width=214
统计每个学生的各科总分和平均分,然后作为新的列合并到原数据中。
sum = df.sum(axis=1)
mean = df.mean(axis=1)

df["总分"] = sum
df["平均分"] = mean
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684374249668-08428111-8271-4c87-978f-94a26a42a22d.png#averageHue=%23e6e2e1&clientId=u636fbd4c-2335-4&from=paste&height=181&id=uae8bdd4b&originHeight=181&originWidth=358&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13205&status=done&style=stroke&taskId=u5941c706-f8d7-431d-91f0-65079005071&title=&width=358
这样可以更全面的查看每个学生的学习情况。
2. 订单统计的场景

订单统计的这个示例稍微复杂点,因为一个订单ID可能包含多个物品,
按订单ID来统计每个订单合计信息时,不能简单的像上面的统计成绩那样直接计算按行统计。
df = pd.DataFrame(
    {
      "id": ,
      "product": ["苹果", "香蕉", "手机",
                  "冰箱", "电视", "空调"],
      "price": [24, 15, 2000, 8000,
                  5500, 7800],
    }
)

dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684375710297-4528836d-f703-479b-8173-13c8429dda13.png#averageHue=%23e7e0e0&clientId=u636fbd4c-2335-4&from=paste&height=233&id=u916aea6a&originHeight=233&originWidth=200&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10116&status=done&style=stroke&taskId=ubf242fb6-7da2-49ce-9820-77661ab8cc1&title=&width=200
如上所示,总共有3个订单,根据订单号统计每个订单的总价如下:
df.groupby("id").price.sum()https://cdn.nlark.com/yuque/0/2023/png/2235414/1684375921534-3efbf5ab-df4d-42a3-8034-ce5ef42f4d8c.png#averageHue=%23efefef&clientId=u636fbd4c-2335-4&from=paste&height=136&id=u20d6853d&originHeight=136&originWidth=254&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7710&status=done&style=stroke&taskId=u39a3c206-d2c5-4a40-87ec-8491d018c81&title=&width=254
得到每个订单ID对应的总价格,但是合计信息只有3行,而原来的数据是6行,无法直接合并到原数据。
这种情况下,我们需要用pandas里的transform函数。
transform函数分组统计之后,会保持原来的行数。
df["总价"] = df.groupby("id").price.transform("sum")
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684376683796-ea49a447-94aa-4ec5-bf07-3a7a31e1d908.png#averageHue=%23e6e0e0&clientId=u636fbd4c-2335-4&from=paste&height=233&id=u38262aab&originHeight=233&originWidth=260&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12706&status=done&style=stroke&taskId=udd8cefb2-b544-4805-ae87-3883712f15c&title=&width=260
相同的订单ID,统计的总价是一样的。
把总价的信息附加在订单的每个具体物品之后,
还可以基于此统计出同一个订单中每个物品价格所占总价的百分比。
df["百分比"] = df.price / df["合计"]
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684377370394-51b5ea1d-14dc-4e88-bc11-4527cc44d128.png#averageHue=%23e6e1e1&clientId=u636fbd4c-2335-4&from=paste&height=236&id=u72d1663f&originHeight=236&originWidth=345&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16098&status=done&style=stroke&taskId=u1efa0745-beb6-473c-bf40-c6b300a7a01&title=&width=345
总之,统计值作为新的列,不仅可以更好的比较和观察原始数据和统计值,
还可以基于新的统计列,再统计出其他的信息。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【pandas小技巧】--统计值作为新列