這次介紹的小技巧不是統計,而是把統計結果作為**新列**和原來的數據放在一起。`pandas`的各種統計功能之前已經介紹了不少,但是每次都是統計結果歸統計結果,原始數據歸原始數據,沒有把它們合併在一個數據集中來觀察。 下麵通過兩個場景示例來演示如果把統計值作為新列的數據。 # 1. 成績統計的場景 ...
這次介紹的小技巧不是統計,而是把統計結果作為新列和原來的數據放在一起。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")]
df
統計每個學生的各科總分和平均分,然後作為新的列合併到原數據中。
sum = df.sum(axis=1)
mean = df.mean(axis=1)
df["總分"] = sum
df["平均分"] = mean
df
這樣可以更全面的查看每個學生的學習情況。
2. 訂單統計的場景
訂單統計的這個示例稍微複雜點,因為一個訂單ID可能包含多個物品,
按訂單ID來統計每個訂單合計信息時,不能簡單的像上面的統計成績那樣直接計算按行統計。
df = pd.DataFrame(
{
"id": [1, 1, 2, 3, 3, 3],
"product": ["蘋果", "香蕉", "手機",
"冰箱", "電視", "空調"],
"price": [24, 15, 2000, 8000,
5500, 7800],
}
)
df
如上所示,總共有3
個訂單,根據訂單號統計每個訂單的總價如下:
df.groupby("id").price.sum()
得到每個訂單ID對應的總價格,但是合計信息只有3
行,而原來的數據是6
行,無法直接合併到原數據。
這種情況下,我們需要用pandas
里的transform
函數。
transform函數分組統計之後,會保持原來的行數。
df["總價"] = df.groupby("id").price.transform("sum")
df
相同的訂單ID,統計的總價是一樣的。
把總價的信息附加在訂單的每個具體物品之後,
還可以基於此統計出同一個訂單中每個物品價格所占總價的百分比。
df["百分比"] = df.price / df["合計"]
df
總之,統計值作為新的列,不僅可以更好的比較和觀察原始數據和統計值,
還可以基於新的統計列,再統計出其他的信息。