データの演算・記述統計
Contents
データの演算・記述統計#
pandasには数値データを高速にかつ効率よく演算・集計する機能が備わっています。本節では Series
および DataFrame
に対して算術演算や記述統計を行う方法について学びます。
本節では数値データを乱数で生成します。乱数はNumPyの random.randn
関数を実行して、4行4列からなる標準正規分布に従う乱数を生成します。 numpy
モジュールは一般的に np
という別名でインポートされます。
import numpy as np
import pandas as pd
rng = np.random.default_rng(2)
ser = pd.Series(rng.normal(size=4))
df = pd.DataFrame(rng.normal(size=(4, 4)), columns=list("abcd"))
ser
0 0.189053
1 -0.522748
2 -0.413064
3 -2.441467
dtype: float64
df
a | b | c | d | |
---|---|---|---|---|
0 | 1.799707 | 1.144166 | -0.325423 | 0.773807 |
1 | 0.281211 | -0.553823 | 0.977567 | -0.310557 |
2 | -0.328824 | -0.792147 | 0.454958 | -0.099198 |
3 | 0.545289 | -0.607186 | 0.126828 | -0.892274 |
演算子による演算#
Series
および DataFrame
に対して演算子による演算を行うと、すべての要素に対して演算されます。
ser + 10
0 10.189053
1 9.477252
2 9.586936
3 7.558533
dtype: float64
df ** 2
a | b | c | d | |
---|---|---|---|---|
0 | 3.238947 | 1.309116 | 0.105900 | 0.598777 |
1 | 0.079079 | 0.306720 | 0.955638 | 0.096445 |
2 | 0.108125 | 0.627496 | 0.206987 | 0.009840 |
3 | 0.297340 | 0.368674 | 0.016085 | 0.796153 |
Series
と DataFrame
同士の演算ができます。この場合、演算対象の要素数が合致している必要があります。
ser + ser * 2
0 0.567160
1 -1.568245
2 -1.239191
3 -7.324402
dtype: float64
df / df
a | b | c | d | |
---|---|---|---|---|
0 | 1.0 | 1.0 | 1.0 | 1.0 |
1 | 1.0 | 1.0 | 1.0 | 1.0 |
2 | 1.0 | 1.0 | 1.0 | 1.0 |
3 | 1.0 | 1.0 | 1.0 | 1.0 |
関数・メソッドによる演算#
Series
および DataFrame
には関数が適用できます。
次のコードは各要素に関数を適用しています。
abs(ser)
0 0.189053
1 0.522748
2 0.413064
3 2.441467
dtype: float64
Series
および DataFrame
には記述統計のためのメソッドが用意されています。
Function | Description |
---|---|
count | Number of non-NA observations |
sum | Sum of values |
mean | Mean of values |
mad | Mean absolute deviation |
median | Arithmetic median of values |
min | Minimum |
max | Maximum |
mode | Mode |
abs | Absolute Value |
prod | Product of values |
std | Bessel-corrected sample standard deviation |
var | Unbiased variance |
sem | Standard error of the mean |
skew | Sample skewness (3rd moment) |
kurt | Sample kurtosis (4th moment) |
quantile | Sample quantile (value at %) |
cumsum | Cumulative sum |
cumprod | Cumulative product |
cummax | Cumulative maximum |
cummin | Cumulative minimum |
https://pandas.pydata.org/pandas-docs/stable/user_guide/basics.html#descriptive-statistics
round(df)
a | b | c | d | |
---|---|---|---|---|
0 | 2.0 | 1.0 | -0.0 | 1.0 |
1 | 0.0 | -1.0 | 1.0 | -0.0 |
2 | -0.0 | -1.0 | 0.0 | -0.0 |
3 | 1.0 | -1.0 | 0.0 | -1.0 |
# 合計値
ser.sum()
-3.1882259857189634
df.sum()
a 2.297383
b -0.808989
c 1.233931
d -0.528222
dtype: float64
# 算術平均
ser.mean()
-0.7970564964297409
df.mean()
a 0.574346
b -0.202247
c 0.308483
d -0.132056
dtype: float64
DataFrame
に対して集計を行うメソッドは、デフォルトで列に対して演算を行います。行に対して演算を行うにはメソッドの引数 axis
に 1
を渡します。
df.mean(axis=1)
0 0.848064
1 0.098600
2 -0.191303
3 -0.206836
dtype: float64
describe
メソッドを実行すると、基本統計量を算出できます。パーセント表示はパーセンタイル値です。
df.describe()
a | b | c | d | |
---|---|---|---|---|
count | 4.000000 | 4.000000 | 4.000000 | 4.000000 |
mean | 0.574346 | -0.202247 | 0.308483 | -0.132056 |
std | 0.895172 | 0.903399 | 0.548927 | 0.690763 |
min | -0.328824 | -0.792147 | -0.325423 | -0.892274 |
25% | 0.128702 | -0.653426 | 0.013765 | -0.455986 |
50% | 0.413250 | -0.580504 | 0.290893 | -0.204877 |
75% | 0.858893 | -0.129326 | 0.585610 | 0.119053 |
max | 1.799707 | 1.144166 | 0.977567 | 0.773807 |
apply
メソッドを実行すると、引数に渡した任意の関数を適用できます。
ser.apply(abs)
0 0.189053
1 0.522748
2 0.413064
3 2.441467
dtype: float64
df.apply(sum)
a 2.297383
b -0.808989
c 1.233931
d -0.528222
dtype: float64
apply
メソッドは、デフォルトで列に対して演算を行います。行に対して演算を行うにはメソッドの引数 axis に 1 を渡します。
df.apply(sum, axis=1)
0 3.392257
1 0.394399
2 -0.765211
3 -0.827343
dtype: float64
次のように、関数を定義して適用できます。
def max_sub_min(x):
return x.max() - x.min()
df.apply(max_sub_min)
a 2.128531
b 1.936313
c 1.302990
d 1.666081
dtype: float64
無名関数を利用することで、関数の定義を省略できます。
https://docs.python.org/ja/3/reference/expressions.html#lambda
df.apply(lambda x: x.max() - x.min())
a 2.128531
b 1.936313
c 1.302990
d 1.666081
dtype: float64
練習問題1#
ser
オブジェクトの中央値を算出してください。
ser
0 0.189053
1 -0.522748
2 -0.413064
3 -2.441467
dtype: float64
# 解答セル
練習問題2#
df
オブジェクトの列ごとの中央値を算出してください。
df
a | b | c | d | |
---|---|---|---|---|
0 | 1.799707 | 1.144166 | -0.325423 | 0.773807 |
1 | 0.281211 | -0.553823 | 0.977567 | -0.310557 |
2 | -0.328824 | -0.792147 | 0.454958 | -0.099198 |
3 | 0.545289 | -0.607186 | 0.126828 | -0.892274 |
# 解答セル
練習問題3#
df
オブジェクトの行ごとの中央値を算出してください。
# 解答セル
練習問題4#
ser
オブジェクトの各要素に次の関数を適用してください。
# 解答セル
練習問題5#
df
オブジェクトの各要素に次の関数を適用してください。
# 解答セル