Python、R言語の書き換えメモ(データフレーム編)
Python、R言語の書き換え(変換)メモのデータフレーム編です。
Pythonではデータフレームの操作はpandasモジュールをインポートして行います。最初にインポートしておきましょう。
Python
>>> import pandas as pd
- 1. データフレームの作成
- 2. データフレームの行数(rows)と列数(columns)を取得
- 3. データフレームのカラム名を取得
- 4. データフレームの概要(サマリー)を取得
- 5. データフレームの特定の行の値を取得する
- 6. データフレームの先頭の1行のデータを取得
- 7. データフレームの終端の1行のデータを取得
- 8. データの合計を求める
- 9. データの平均を求める
- 10. データの中央値を求める
- 11. データの分散を求める
- 12. データの標準偏差を求める
- 13. データの最大値を求める
- 14. データの最小値を求める
- 15. データの個数を求める
- 16. データの検索を行う
- 17. データフレームに行データを追加・削除する
- 18. データフレームに列データを追加・削除する
- 19. データフレームをcsv形式でエクスポートする
- 20. csv形式のファイルをインポートする
データフレームの作成
Python
>>> df = pd.DataFrame({
'name': ["Yamada", "Yamakawa", "Yamamoto", "Yamazaki"],
'height': [170, 168, 176, 182],
'weight': [62, 60, 70, 80],
'age': [35, 40, 28, 33],
'blood': ["A", "O", "B", "A"]})
>>> df
name height weight age blood
0 Yamada 170 62 35 A
1 Yamakawa 168 60 40 O
2 Yamamoto 176 70 28 B
3 Yamazaki 182 80 33 A
※Pythonの行番号は0から始まる
R言語
> df <- data.frame(
name = c("Yamada", "Yamakawa", "Yamamoto", "Yamazaki"),
height = c(170, 168, 176, 182), weight = c(62, 60, 70, 80),
age = c(35, 40, 28, 33),
blood = c("A", "O", "B", "A"))
> df
name height weight age blood
1 Yamada 170 62 35 A
2 Yamakawa 168 60 40 O
3 Yamamoto 176 70 28 B
4 Yamazaki 182 80 33 A
※R言語の行番号は1から始まる
データフレームの行数(rows)と列数(columns)を取得
Python
# 行数(rows)と列数(columns)を一度に取得 >>> df.shape (4, 5) # 行数(rows)のみ取得 >>> df.shape[0] 4 # 列数(columns)のみ取得 >>> df.shape[1] 5
R言語
# 行数(rows)と列数(columns)を一度に取得 > dim(df) [1] 4 5 # 行数(rows)のみ取得 > nrow(df) [1] 4 # 列数(columns)のみ取得 > ncol(df) [1] 5
データフレームのカラム名を取得
Python
>>> df.columns Index(['name', 'height', 'weight', 'age', 'blood'], dtype=‘object')
R言語
> colnames(df) [1] "name" "height" "weight" "age" "blood"
データフレームの概要(サマリー)を取得
Python
>>> df.describe()
height weight age
count 4.000000 4.000000 4.000000
mean 174.000000 68.000000 34.000000
std 6.324555 9.092121 4.966555
min 168.000000 60.000000 28.000000
25% 169.500000 61.500000 31.750000
50% 173.000000 66.000000 34.000000
75% 177.500000 72.500000 36.250000
max 182.000000 80.000000 40.000000
・describe関数が返す値
count : データ数
mean : 平均値
std : 標準偏差
min : 最小値
25% : 25パーセンタイル(第一四分位数)
50% : 50パーセンタイル(第二四分位数)(中央値)
75% : 75パーセンタイル(第三四分位数)
max : 最大値
R言語
> summary(df)
name height weight age blood
Length:4 Min. :168.0 Min. :60.0 Min. :28.00 Length:4
Class :character 1st Qu.:169.5 1st Qu.:61.5 1st Qu.:31.75 Class :character
Mode :character Median :173.0 Median :66.0 Median :34.00 Mode :character
Mean :174.0 Mean :68.0 Mean :34.00
3rd Qu.:177.5 3rd Qu.:72.5 3rd Qu.:36.25
Max. :182.0 Max. :80.0 Max. :40.00
・summaryが返す値
Min : 最小値
1st Qu : 第一四分位数 (25パーセンタイル)
Median : 中央値 (50パーセンタイル)
Mean : 平均値
3rd Qu : 第三四分位数 (75パーセンタイル)
Max : 最大値
データフレームの特定の行の値を取得する
Python
# 3行目のデータの値を取得する >>> df.iloc[2] name Yamamoto height 176 weight 70 age 28 blood B Name: 2, dtype: object # 3行目のheightの値のみを取得する >>> df.iloc[2].height 176
R言語
# 3行目のデータの値を取得する
> df[3,]
name height weight age blood
3 Yamamoto 176 70 28 B
# 3行目のheightの値のみを取得する
> df[3,'height']
[1] 176
データフレームの先頭の1行のデータを取得
Python
>>> df.head(1)
name height weight age blood
0 Yamada 170 62 35 A
R言語
> head(df, n=1)
name height weight age blood
1 Yamada 170 62 35 A
データフレームの終端の1行のデータを取得
Python
>>> df.tail(1)
name height weight age blood
3 Yamazaki 182 80 33 A
R言語
> tail(df,n=1)
name height weight age blood
4 Yamazaki 182 80 33 A
データの合計を求める
Python
>>> df['height'].sum() 696 >>> df.sum().height 696
R言語
> sum(df$height) [1] 696
データの平均を求める
Python
# heightの平均値を取得 >>> df['height'].mean() 174.0 >>> df.mean().height 174.0
R言語
# heightの平均値を取得 > mean(df$height) [1] 174
データの中央値を求める
Python
>>> df['height'].median() 173.0 >>> df.median().height 173.0
R言語
> median(df$height) [1] 173
データの分散を求める
Python
>>> df['height'].var() 40.0 >>> df.var().height 40.0
R言語
> var(df$height) [1] 40
データの標準偏差を求める
Python
>>> df['height'].std() 6.324555320336759 >>> df.std().height 6.324555320336759
R言語
> sd(df$height) [1] 6.324555
データの最大値を求める
Python
>>> df['height'].max() 182 >>> df.max().height 182
R言語
> max(df$height) [1] 182
データの最小値を求める
Python
>>> df['height'].min() 168 >>> df.min().height 168
R言語
> min(df$height) [1] 168
データの個数を求める
Python
>>> df['height'].count() 4 >>> df.count().height 4
R言語
> length(df$height) [1] 4
データの検索を行う
Python
# 血液型がA型の人のデータを取得
>>> df[df["blood"] == "A"]
name height weight age blood
0 Yamada 170 62 35 A
3 Yamazaki 182 80 33 A
# 血液型がA型の人のデータを取得
>>> df.query('blood =="A"')
name height weight age blood
0 Yamada 170 62 35 A
3 Yamazaki 182 80 33 A
R言語
# 血液型がA型の人のデータを取得
> df[df$blood == "A",]
name height weight age blood
1 Yamada 170 62 35 A
4 Yamazaki 182 80 33 A
# 血液型がA型の人のデータを取得
> library(dplyr)
> df %>% filter(blood == "A")
name height weight age blood
1 Yamada 170 62 35 A
2 Yamazaki 182 80 33 A
複数条件の検索
Python
# 血液型がA型で体重が70Kg以上の人のデータを取得
>>> df[(df["blood"] == "A") & (df["weight"] > 70)]
name height weight age blood
3 Yamazaki 182 80 33 A
# 血液型がA型で体重が70Kg以上の人のデータを取得
>>> df.query('blood == "A" & weight > 70')
name height weight age blood
3 Yamazaki 182 80 33 A
R言語
# 血液型がA型で体重が70Kg以上の人のデータを取得
> df[df$weight > 70 & df$blood=="A",]
name height weight age blood
4 Yamazaki 182 80 33 A
# 血液型がA型で体重が70Kg以上の人のデータを取得
> df %>% filter(blood == "A" & weight > 70)
name height weight age blood
1 Yamazaki 182 80 33 A
データフレームに行データを追加・削除する
Python
# append関数を使って行データを追加するパターン
>>> df1 = df.append({
'name': "Yamaguchi",
'height': 174,
'weight': 75,
'age': 48,
'blood': "AB"},
ignore_index=True)
# tmpで追加する行データを作成しておいてから、concat関数で行データを追加するパターン
>>> tmp = pd.DataFrame({
'name': ["Yamaguchi"],
'height': [174],
'weight': [75],
'age': [48],
'blood': ["AB"]})
>>> df1 = pd.concat([df, tmp], ignore_index=True)
# 追加したデータの確認
>>> df1
name height weight age blood
0 Yamada 170 62 35 A
1 Yamakawa 168 60 40 O
2 Yamamoto 176 70 28 B
3 Yamazaki 182 80 33 A
4 Yamaguchi 174 75 48 AB
# drop関数でインデックス番号を指定してデータを削除
>>> df1 = df1.drop(index=4)
>>> df1
name height weight age blood
0 Yamada 170 62 35 A
1 Yamakawa 168 60 40 O
2 Yamamoto 176 70 28 B
3 Yamazaki 182 80 33 A
R言語
# tmpで追加するデータフレーム行を作成してからbind関数でデータを追加する
> tmp <- data.frame(
name = c("Yamaguchi"),
height = c(174),
weight = c(75),
age = c(48),
blood = c("AB"))
> df1 <- rbind(df, tmp)
# 追加したデータの確認
> df1
name height weight age blood
1 Yamada 170 62 35 A
2 Yamakawa 168 60 40 O
3 Yamamoto 176 70 28 B
4 Yamazaki 182 80 33 A
5 Yamaguchi 174 75 48 AB
# インデックス番号にマイナスをつけて削除
> df1 <-df1[-5,]
> df1
name height weight age blood
1 Yamada 170 62 35 A
2 Yamakawa 168 60 40 O
3 Yamamoto 176 70 28 B
4 Yamazaki 182 80 33 A
データフレームに列データを追加・削除する
Python
# assign関数を使ってgender列を追加するパターン
>>> df2 = df.assign(gender=["m","f","m","f"])
# 一旦コピーしたデータフレームに新たにgender列を追加するパターン
>>> df2 = df
>>> df2["gender"]=["m","f","m","f"]
# 追加したデータを確認する
>>> df2
name height weight age blood gender
0 Yamada 170 62 35 A m
1 Yamakawa 168 60 40 O f
2 Yamamoto 176 70 28 B m
3 Yamazaki 182 80 33 A f
# 追加したgender列を削除する
>>> df2 = df2.drop('gender', axis=1)
R言語
# mutate関数を使ってgender列を追加するパターン
> library(dplyr)
> df2 <- df %>% mutate(gender = c("m","f","m","f"))
# 一旦コピーしたデータフレームに新たにgender列を追加するパターン
> df2 <- df
> df2["gender"] <- c("m","f","m","f")
# 追加したgender列を削除する
> df2 <- df2[, -6]
データフレームをcsv形式でエクスポートする
Python
>>> df.to_csv(‘mydata.csv')
R言語
> write.csv(df, "mydata.csv")
csv形式のファイルをインポートする
Python
>>> df = pd.read_csv('mydata.csv', index_col=0)
>>> df
name height weight age blood
0 Yamada 170 62 35 A
1 Yamakawa 168 60 40 O
2 Yamamoto 176 70 28 B
3 Yamazaki 182 80 33 A
R言語
> df=read.csv("mydata.csv", row.names=1)
> df
name height weight age blood
1 Yamada 170 62 35 A
2 Yamakawa 168 60 40 O
3 Yamamoto 176 70 28 B
4 Yamazaki 182 80 33 A
|
|
|







