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
|
|