Python、R言語の書き換えメモ(データフレーム編)

2023年7月31日

PythonR言語の書き換え(変換)メモのデータフレーム編です。
Pythonではデータフレームの操作はpandasモジュールインポートして行います。最初にインポートしておきましょう。

Python

>>> import pandas as pd




データフレームの作成

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