Pandas

[Python] Pandas – DataFrameの基本的な使い方を解説

PandasのDataFrameは、Pythonでデータを扱う際に非常に便利な2次元のデータ構造です。

行と列で構成され、Excelの表のようにデータを操作できます。

DataFrameはpd.DataFrame()で作成し、リストや辞書、NumPy配列などから生成可能です。

データの読み込みにはpd.read_csv()などが使われ、データの表示にはdf.head()df.tail()が便利です。

列の選択はdf['列名']、行の選択はdf.loc[]df.iloc[]で行います。

DataFrameとは

PandasのDataFrameは、2次元のラベル付きデータ構造で、異なるデータ型を持つ列を持つことができます。

行と列のインデックスを持ち、データの操作や分析を効率的に行うための強力なツールです。

データの整形、集計、フィルタリングなど、さまざまな操作が簡単に行えます。

DataFrameの基本構造

DataFrameは、以下のような基本構造を持っています。

構成要素説明
データの各エントリを表す。インデックスで識別される。
データの属性を表す。各列は異なるデータ型を持つことができる。
インデックス行を識別するためのラベル。デフォルトでは0から始まる整数が使用される。

DataFrameは、リスト、辞書、NumPy配列などから作成することができます。

Seriesとの違い

Seriesは、Pandasのもう一つの基本的なデータ構造で、1次元のラベル付き配列です。

DataFrameは、複数のSeriesを持つことができ、各Seriesが列を形成します。

以下に、SeriesとDataFrameの違いを示します。

特徴SeriesDataFrame
次元1次元2次元
構造単一のデータ列複数のデータ列
インデックスラベル付きインデックス行と列の両方にインデックス

Seriesは、単一のデータ列を扱う場合に便利であり、DataFrameは複数のデータ列を同時に扱う場合に適しています。

DataFrameの作成方法

DataFrameは、さまざまな方法で作成できます。

以下に、いくつかの一般的な方法を示します。

  1. リストからの作成
import pandas as pd
data = [[1, 'Alice'], [2, 'Bob'], [3, 'Charlie']]
df = pd.DataFrame(data, columns=['ID', 'Name'])
print(df)
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie
  1. 辞書からの作成
import pandas as pd
data = {
    'ID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie']
}
df = pd.DataFrame(data)
print(df)
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie
  1. NumPy配列からの作成
import pandas as pd
import numpy as np
data = np.array([[1, 'Alice'], [2, 'Bob'], [3, 'Charlie']])
df = pd.DataFrame(data, columns=['ID', 'Name'])
print(df)
  ID     Name
0  1    Alice
1  2      Bob
2  3  Charlie
  1. CSVファイルからの読み込み
import pandas as pd
df = pd.read_csv('data.csv')
print(df)

出力結果はファイルの内容によります。

  1. Excelファイルからの読み込み
import pandas as pd
df = pd.read_excel('data.xlsx')
print(df)

出力結果はファイルの内容によります。

これらの方法を使って、さまざまな形式のデータを簡単にDataFrameに変換することができます。

DataFrameの作成方法

PandasのDataFrameは、さまざまなデータソースから簡単に作成できます。

以下に、一般的な作成方法を詳しく解説します。

リストからの作成

リストを使用してDataFrameを作成することができます。

リストの各要素は、DataFrameの行を表します。

import pandas as pd
data = [[1, 'Alice'], [2, 'Bob'], [3, 'Charlie']]
df = pd.DataFrame(data, columns=['ID', 'Name'])
print(df)
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie

この例では、リストの各サブリストが1行を構成し、columns引数で列名を指定しています。

辞書からの作成

辞書を使用してDataFrameを作成することも可能です。

辞書のキーが列名、値が列のデータになります。

import pandas as pd
data = {
    'ID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie']
}
df = pd.DataFrame(data)
print(df)
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie

この方法では、各キーが列名として使用され、対応するリストがその列のデータになります。

NumPy配列からの作成

NumPy配列を使用してDataFrameを作成することもできます。

NumPy配列は、数値データを効率的に扱うための強力なツールです。

import pandas as pd
import numpy as np
data = np.array([[1, 'Alice'], [2, 'Bob'], [3, 'Charlie']])
df = pd.DataFrame(data, columns=['ID', 'Name'])
print(df)
  ID     Name
0  1    Alice
1  2      Bob
2  3  Charlie

NumPy配列を使用することで、数値データと文字列データを混在させたDataFrameを作成できます。

CSVファイルからの読み込み

CSVファイルからDataFrameを作成することも非常に一般的です。

read_csv()関数を使用して、CSVファイルを簡単に読み込むことができます。

import pandas as pd
df = pd.read_csv('data.csv')
print(df)

出力結果はファイルの内容によります。

CSVファイルには、カンマ区切りでデータが保存されており、最初の行が列名として使用されます。

Excelファイルからの読み込み

ExcelファイルからDataFrameを作成することも可能です。

read_excel()関数を使用して、Excelファイルを読み込むことができます。

import pandas as pd
df = pd.read_excel('data.xlsx')
print(df)

出力結果はファイルの内容によります。

Excelファイルの最初のシートがデフォルトで読み込まれ、列名は最初の行から取得されます。

これらの方法を使うことで、さまざまな形式のデータを簡単にDataFrameに変換し、データ分析や処理を行うことができます。

DataFrameの基本操作

PandasのDataFrameを使うことで、データの表示、選択、フィルタリング、追加・削除などの基本操作を簡単に行うことができます。

以下に、これらの操作について詳しく解説します。

データの表示

DataFrameの内容を確認するための基本的なメソッドがあります。

head()とtail()の使い方

head()メソッドは、DataFrameの最初の数行を表示します。

デフォルトでは5行が表示されますが、引数で表示する行数を指定できます。

import pandas as pd
data = {
    'ID': [1, 2, 3, 4, 5],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva']
}
df = pd.DataFrame(data)
# 最初の3行を表示
print(df.head(3))
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie

tail()メソッドは、DataFrameの最後の数行を表示します。

こちらも引数で表示する行数を指定できます。

# 最後の2行を表示
print(df.tail(2))
ID   Name
3   4  David
4   5    Eva

info()とdescribe()の使い方

info()メソッドは、DataFrameの概要を表示します。

データ型や欠損値の数などの情報が得られます。

# DataFrameの情報を表示
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   ID      5 non-null      int64 
 1   Name    5 non-null      object
dtypes: int64(1), object(1)
memory usage: 120.0+ bytes

describe()メソッドは、数値データの統計情報を表示します。

平均値、標準偏差、最小値、最大値などが得られます。

# 統計情報を表示
print(df.describe())
ID
count  5.000000
mean   3.000000
std    1.581139
min    1.000000
25%    2.000000
50%    3.000000
75%    4.000000
max    5.000000

列の選択

DataFrameから特定の列を選択する方法を見ていきます。

列名での選択

列名を指定して単一の列を選択することができます。

# 'Name'列を選択
name_column = df['Name']
print(name_column)
0      Alice
1        Bob
2    Charlie
3      David
4        Eva
Name: Name, dtype: object

複数列の選択

複数の列を選択する場合は、リストを使います。

# 'ID'と'Name'列を選択
selected_columns = df[['ID', 'Name']]
print(selected_columns)
ID     Name
0   1   Alice
1   2     Bob
2   3 Charlie
3   4   David
4   5     Eva

行の選択

行を選択する方法には、loc[]iloc[]があります。

loc[]によるラベル指定

loc[]を使うと、行ラベルを指定して行を選択できます。

# ラベル0の行を選択
row_0 = df.loc[0]
print(row_0)
ID          1
Name    Alice
Name: 0, dtype: object

iloc[]によるインデックス指定

iloc[]を使うと、行インデックスを指定して行を選択できます。

# インデックス1の行を選択
row_1 = df.iloc[1]
print(row_1)
ID       2
Name    Bob
Name: 1, dtype: object

データのフィルタリング

特定の条件に基づいてデータをフィルタリングする方法を見ていきます。

条件式によるフィルタリング

条件式を使って、特定の条件を満たす行を選択できます。

# IDが3以上の行を選択
filtered_df = df[df['ID'] >= 3]
print(filtered_df)
ID     Name
2   3 Charlie
3   4   David
4   5     Eva

複数条件の組み合わせ

複数の条件を組み合わせてフィルタリングすることも可能です。

# IDが2以上かつNameが'Bob'でない行を選択
filtered_df = df[(df['ID'] >= 2) & (df['Name'] != 'Bob')]
print(filtered_df)
ID     Name
2   3 Charlie
3   4   David
4   5     Eva

データの追加・削除

DataFrameにデータを追加したり削除したりする方法を見ていきます。

列の追加

新しい列を追加するには、列名を指定して値を代入します。

# 'Age'列を追加
df['Age'] = [25, 30, 35, 40, 45]
print(df)
ID     Name  Age
0   1   Alice   25
1   2     Bob   30
2   3 Charlie   35
3   4   David   40
4   5     Eva   45

行の追加

新しい行を追加するには、loc[]を使って新しいインデックスを指定します。

# 新しい行を追加
df.loc[5] = [6, 'Frank', 50]
print(df)
ID     Name  Age
0   1   Alice   25
1   2     Bob   30
2   3 Charlie   35
3   4   David   40
4   5     Eva   45
5   6   Frank   50

列の削除

列を削除するには、drop()メソッドを使用します。

# 'Age'列を削除
df = df.drop(columns=['Age'])
print(df)
ID     Name
0   1   Alice
1   2     Bob
2   3 Charlie
3   4   David
4   5     Eva
5   6   Frank

行の削除

行を削除する場合も、drop()メソッドを使用します。

# インデックス1の行を削除
df = df.drop(index=1)
print(df)
ID     Name
0   1   Alice
2   3 Charlie
3   4   David
4   5     Eva
5   6   Frank

これらの基本操作を使うことで、DataFrameのデータを効率的に操作し、分析を行うことができます。

データの集計と変形

Pandasを使用すると、データの集計や変形を簡単に行うことができます。

以下に、グループ化、ピボットテーブルの作成、データのソート、欠損値の処理について詳しく解説します。

グループ化と集計

データをグループ化して集計することで、特定の条件に基づいた分析が可能になります。

groupby()の使い方

groupby()メソッドを使用して、特定の列に基づいてデータをグループ化します。

import pandas as pd

data = {
    'ID': [1, 2, 3, 4, 5, 6],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank'],
    'Score': [85, 90, 95, 80, 70, 90],
    'Class': ['A', 'A', 'B', 'B', 'A', 'B']
}

df = pd.DataFrame(data)

# 'Class'でグループ化し、数値データのみを選択
grouped = df.groupby('Class')[['ID', 'Score']].mean()

print(grouped)
             ID      Score
Class
A      2.666667  81.666667
B      4.333333  88.333333

この例では、Class列に基づいてデータをグループ化し、各クラスのIDとScoreの平均を計算しています。

集計関数の適用

グループ化したデータに対して、さまざまな集計関数を適用できます。

# 各クラスのScoreの合計を計算
total_score = grouped['Score'].sum()
print(total_score)
     Class
A    265
B    285
Name: Score, dtype: int64

この例では、各クラスのScoreの合計を計算しています。

ピボットテーブルの作成

ピボットテーブルを使用すると、データをより視覚的に整理できます。

pivot_table()の使い方

pivot_table()メソッドを使用して、データをピボットテーブル形式に変換します。

# ピボットテーブルの作成
pivot_table = pd.pivot_table(df, values='Score', index='Class', aggfunc='mean')
print(pivot_table)
Score
Class       
A      81.666667
B      88.333333

この例では、Classをインデックスにして、Scoreの平均を計算したピボットテーブルを作成しています。

ピボットテーブルの応用例

ピボットテーブルは、複数の集計関数を同時に適用することも可能です。

# 複数の集計関数を適用
pivot_table_multi = pd.pivot_table(df, values='Score', index='Class', aggfunc=[min, max, 'mean'])
print(pivot_table_multi)
min   max      mean
Class                         
A      70.0  90.0  81.666667
B      80.0  95.0  88.333333

この例では、各クラスのScoreの最小値、最大値、平均値を計算したピボットテーブルを作成しています。

データのソート

データをソートすることで、特定の順序で表示することができます。

行・列のソート

sort_values()メソッドを使用して、特定の列に基づいて行をソートできます。

# Scoreで行をソート
sorted_df = df.sort_values(by='Score', ascending=False)
print(sorted_df)
ID     Name  Score Class
2   3 Charlie     95    B
1   2     Bob     90    A
5   6   Frank     90    B
0   1   Alice     85    A
3   4   David     80    B
4   5     Eva     70    A

この例では、Scoreの降順で行をソートしています。

複数列でのソート

複数の列を指定してソートすることも可能です。

# Classで昇順、Scoreで降順にソート
sorted_multi = df.sort_values(by=['Class', 'Score'], ascending=[True, False])
print(sorted_multi)
ID     Name  Score Class
0   1   Alice     85    A
1   2     Bob     90    A
4   5     Eva     70    A
3   4   David     80    B
2   3 Charlie     95    B
5   6   Frank     90    B

この例では、Classで昇順、Scoreで降順にソートしています。

欠損値の処理

データに欠損値が含まれている場合、適切に処理することが重要です。

欠損値の確認

isnull()メソッドを使用して、欠損値を確認できます。

# 欠損値の確認
missing_values = df.isnull().sum()
print(missing_values)
ID       0
Name     0
Score    0
Class    0
dtype: int64

この例では、各列の欠損値の数を表示しています。

欠損値の削除

欠損値を含む行を削除するには、dropna()メソッドを使用します。

# 欠損値を含む行を削除
df_cleaned = df.dropna()
print(df_cleaned)

出力結果は、欠損値が削除されたDataFrameになります。

欠損値の補完

欠損値を特定の値で補完するには、fillna()メソッドを使用します。

# 欠損値を0で補完
df_filled = df.fillna(0)
print(df_filled)

出力結果は、欠損値が0で補完されたDataFrameになります。

これらの操作を通じて、データの集計や変形を行い、分析に役立てることができます。

データの結合と結合操作

Pandasを使用すると、複数のDataFrameを結合することができます。

これにより、異なるデータソースを統合し、分析を行うことが可能になります。

以下に、データの結合方法について詳しく解説します。

concat()による結合

concat()メソッドを使用すると、複数のDataFrameを縦または横に結合することができます。

import pandas as pd
# 2つのDataFrameを作成
df1 = pd.DataFrame({
    'ID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie']
})
df2 = pd.DataFrame({
    'ID': [4, 5, 6],
    'Name': ['David', 'Eva', 'Frank']
})
# 縦に結合
concat_df = pd.concat([df1, df2], axis=0)
print(concat_df)
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie
0   4    David
1   5      Eva
2   6    Frank

この例では、axis=0を指定することで、DataFrameを縦に結合しています。

axis=1を指定すると、横に結合されます。

merge()による結合

merge()メソッドを使用すると、SQLのJOIN操作のように、共通の列に基づいてDataFrameを結合できます。

# 2つのDataFrameを作成
df1 = pd.DataFrame({
    'ID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie']
})
df2 = pd.DataFrame({
    'ID': [2, 3, 4],
    'Score': [90, 95, 80]
})
# ID列を基に結合
merged_df = pd.merge(df1, df2, on='ID', how='inner')
print(merged_df)
   ID     Name  Score
0   2      Bob     90
1   3  Charlie     95

この例では、on='ID'でID列を基に結合し、how='inner'で内部結合を行っています。

他にも、how引数にはleftrightouterなどのオプションがあります。

インデックスのリセットと設定

結合後にインデックスをリセットすることができます。

reset_index()メソッドを使用します。

# インデックスをリセット
reset_df = merged_df.reset_index(drop=True)
print(reset_df)
ID     Name  Score
0   2     Bob     90
1   3 Charlie     95

drop=Trueを指定することで、元のインデックスを削除します。

また、特定の列をインデックスとして設定するには、set_index()メソッドを使用します。

# ID列をインデックスに設定
set_index_df = merged_df.set_index('ID')
print(set_index_df)
Name  Score
ID                    
2         Bob     90
3     Charlie     95

結合時の注意点

データを結合する際には、いくつかの注意点があります。

  • 重複した列名: 結合するDataFrameに同じ列名がある場合、merge()メソッドは自動的に接尾辞を追加します。

接尾辞を変更するには、suffixes引数を使用します。

  merged_df = pd.merge(df1, df2, on='ID', how='inner', suffixes=('_left', '_right'))
  • 欠損値の処理: 結合後に欠損値が発生することがあります。

必要に応じて、fillna()メソッドを使用して欠損値を補完することが重要です。

  • データ型の一致: 結合する列のデータ型が一致していることを確認してください。

異なるデータ型の場合、結合が正しく行われないことがあります。

これらのポイントに注意しながら、データの結合を行うことで、より効果的なデータ分析が可能になります。

データの可視化

データの可視化は、データ分析において非常に重要なステップです。

Pandasを使用すると、簡単にデータをプロットすることができます。

以下に、Pandasでのプロット方法、MatplotlibやSeabornとの連携について詳しく解説します。

Pandasでの簡単なプロット

Pandasは、データフレームのデータを簡単に可視化するためのplot()メソッドを提供しています。

plot()の使い方

plot()メソッドを使用すると、DataFrameやSeriesのデータを簡単にプロットできます。

デフォルトでは、折れ線グラフが描画されます。

import pandas as pd
import matplotlib.pyplot as plt
# サンプルデータの作成
data = {
    'Year': [2018, 2019, 2020, 2021, 2022],
    'Sales': [150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)
# 折れ線グラフの作成
df.plot(x='Year', y='Sales', title='Sales Over Years')
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

出力結果は、年ごとの売上を示す折れ線グラフになります。

グラフの種類とオプション

plot()メソッドでは、さまざまな種類のグラフを描画することができます。

kind引数を使用して、グラフの種類を指定します。

# 棒グラフの作成
df.plot(x='Year', y='Sales', kind='bar', title='Sales Over Years')
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

出力結果は、年ごとの売上を示す棒グラフになります。

利用可能なグラフの種類には、以下のようなものがあります。

グラフの種類説明
line折れ線グラフ
bar棒グラフ
barh横棒グラフ
histヒストグラム
box箱ひげ図
scatter散布図
pie円グラフ

Matplotlibとの連携

Pandasのプロット機能は、Matplotlibを基盤としているため、Matplotlibの機能を活用してグラフをカスタマイズすることができます。

# 散布図の作成
df.plot(x='Year', y='Sales', kind='scatter', title='Sales Scatter Plot')
plt.title('Sales Scatter Plot')
plt.xlabel('Year')
plt.ylabel('Sales')
plt.grid()
plt.show()

この例では、散布図を作成し、グリッドを追加しています。

Matplotlibの機能を使用することで、タイトルやラベル、グリッドなどを自由にカスタマイズできます。

Seabornとの連携

Seabornは、Matplotlibを基盤としたデータ可視化ライブラリで、より美しいグラフを簡単に作成することができます。

PandasのDataFrameと連携して使用することができます。

import seaborn as sns
# Seabornのスタイルを設定
sns.set(style='whitegrid')
# Seabornを使用した棒グラフの作成
sns.barplot(x='Year', y='Sales', data=df)
plt.title('Sales Over Years')
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

この例では、Seabornを使用して年ごとの売上を示す棒グラフを作成しています。

Seabornは、デフォルトで美しいスタイルを提供し、簡単に魅力的なグラフを作成できます。

これらの方法を使用することで、Pandasを使ったデータの可視化が簡単に行え、データ分析の結果を視覚的に表現することができます。

応用例

Pandasは、さまざまなデータ処理のニーズに応じて柔軟に対応できる強力なライブラリです。

以下に、Pandasを使用した応用例をいくつか紹介します。

大規模データの処理

Pandasは、大規模なデータセットを効率的に処理するための機能を提供しています。

chunksize引数を使用して、CSVファイルを部分的に読み込むことができます。

import pandas as pd
# 大規模なCSVファイルを部分的に読み込む
chunk_size = 10000  # 1回に読み込む行数
for chunk in pd.read_csv('large_data.csv', chunksize=chunk_size):
    # 各チャンクに対して処理を行う
    print(chunk.head())

この方法を使用することで、メモリに収まりきらない大規模データを効率的に処理できます。

時系列データの操作

Pandasは、時系列データの操作に特化した機能を提供しています。

to_datetime()メソッドを使用して、日付データをDatetime型に変換できます。

# サンプルデータの作成
data = {
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03'],
    'Sales': [100, 150, 200]
}
df = pd.DataFrame(data)
# 日付をDatetime型に変換
df['Date'] = pd.to_datetime(df['Date'])
# 日付をインデックスに設定
df.set_index('Date', inplace=True)
# 日付ごとの売上を表示
print(df)
Sales
Date             
2022-01-01    100
2022-01-02    150
2022-01-03    200

時系列データに対して、リサンプリングや移動平均などの操作を行うこともできます。

# 1日ごとの売上の合計を計算
daily_sales = df.resample('D').sum()
print(daily_sales)

カテゴリデータの処理

Pandasは、カテゴリデータを効率的に処理するための機能を提供しています。

Categorical型を使用することで、メモリの使用量を削減し、処理速度を向上させることができます。

# サンプルデータの作成
data = {
    'Category': ['A', 'B', 'A', 'C', 'B', 'A'],
    'Values': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)
# カテゴリ型に変換
df['Category'] = df['Category'].astype('category')
# カテゴリごとの集計
category_summary = df.groupby('Category')['Values'].sum()
print(category_summary)
Category
A    100
B     70
C     40
Name: Values, dtype: int64

このように、カテゴリデータを使用することで、データの集計や分析が効率的に行えます。

データの正規化と標準化

データの正規化や標準化は、機械学習やデータ分析において重要な前処理ステップです。

Pandasを使用して、データを簡単に正規化または標準化できます。

正規化

正規化は、データを特定の範囲にスケーリングするプロセスです。

以下の例では、Min-Maxスケーリングを使用してデータを0から1の範囲に正規化します。

# サンプルデータの作成
data = {
    'Values': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# Min-Maxスケーリング
df['Normalized'] = (df['Values'] - df['Values'].min()) / (df['Values'].max() - df['Values'].min())
print(df)
   Values  Normalized
0      10        0.00
1      20        0.25
2      30        0.50
3      40        0.75
4      50        1.00

標準化

標準化は、データを平均0、標準偏差1にスケーリングするプロセスです。

以下の例では、Zスコアを使用してデータを標準化します。

# Zスコア標準化
df['Standardized'] = (df['Values'] - df['Values'].mean()) / df['Values'].std()
print(df)
  Category  Values  Standardized
0        A      10     -1.336306
1        B      20     -0.801784
2        A      30     -0.267261
3        C      40      0.267261
4        B      50      0.801784
5        A      60      1.336306

これらの手法を使用することで、データの前処理を行い、機械学習モデルの性能を向上させることができます。

Pandasを活用することで、さまざまなデータ処理のニーズに対応できる柔軟性を持っています。

まとめ

この記事では、Pandasを使用したDataFrameの基本的な使い方から、データの集計、可視化、結合、さらには応用例に至るまで、幅広い操作方法を紹介しました。

これにより、データ分析や処理を行う際の具体的な手法やテクニックを理解することができるでしょう。

今後は、実際のデータセットを使ってこれらの操作を試し、Pandasの機能を活用してデータ分析のスキルを向上させてみてください。

関連記事

Back to top button