pandas.DataFrame.sample()
pandas.DataFrame.sample() メソッドを使うと、データフレームから行や列を 無作為抽出 (ランダムサンプリング) できます。準備として Excel VBA 表計算とプログラミング学習サイト から person.xlsx を読み込んでデータフレームに格納しておきます。person.xlsx には疑似個人情報が 1000 件収められています。
# PANDAS_DATAFRAME_SAMPLE
# In[1]
import numpy as np
import pandas as pd
path = "https://atelierkobato.com/wp-content/uploads/person.xlsx"
data = pd.read_excel(path, header=1)
data
上図では 6 行目まで表示して残りは省略しています (1000 件も載せられないので ...)。あまりたくさんの列があると煩わしいので、drop()メソッドで "ふりがな" と "年齢" は削除しておきます。
# In[2]
data = data.drop(["ふりがな","年齢"], axis=1)
data
sample()メソッドで 1 行を無作為に抜き出してみましょう (実行結果の列ラベルは省略します)。
# In[3]
ds = data.sample(random_state=0)
print(ds)
# 993 栗本 宏樹 男 埼玉県 Twitter
皆さんと実行結果を一致させるために、randam_state で乱数シードを固定していますが、この引数を削除すると実行ごとに異なる結果となります。第 1 引数 n に整数を渡して複数行を無作為抽出することもできます。
# In[4]
# dataから無作為に3行を抽出
ds = data.sample(3, random_state=1)
print(ds)
# 507 根本 汐織 女 大阪府 バトントワリング
# 818 小西 泰光 男 群馬県 ネイルアート
# 452 蔵戸 朋美 女 石川県 革細工
抽出数を比率で指定する
frac キーワードで抽出数の比率を指定することもできます。1 を指定すると全体の 100%、0.1 なら 10% を抜粋します。ここでは、0.01 を指定して、全体の 1 %、すなわち 10 件のデータを抜き出してみましょう。
# In[5]
ds = data.sample(frac=0.01, random_state=2)
print(ds)
'''
37 村崎 笑子 女 山口県 剥製
726 大辻 有沙 女 愛媛県 水上スキー
846 久留島 雅英 男 広島県 応援
295 田崎 ゆい子 女 東京都 パラパラ漫画
924 亀川 愛翔 男 北海道 ペーパークラフト
658 滝井 千佳 女 熊本県 弓道
682 木村 真琴 女 栃木県 物理学
286 木川 理恵 女 福岡県 お菓子作り
880 新屋 草太 男 千葉県 音楽鑑賞
272 隈部 力 男 京都府 ドミノ倒し
'''
デフォルトでは重複なしで抽出しますが、重複を許可して抽出するときは replace に True を渡してください。また、axis=1 を指定すると列を抽出します。
抽出確率を指定する
data から 5 行だけ抜き出して、新しいデータフレーム data2 に格納しておきます。
# In[6]
data2 = data.loc[0:4]
data2
pandas.DataFrame.sample() の weights には、各行が抽出される確率リスト (重み) を渡します。たとえば、data2 から重複を許して最初の行を 60 %, 残りの各行を 10% で抽出するコードは以下のようになります。
# In[7]
# 各行が抽出される確率
w = [0.6, 0.1, 0.1, 0.1, 0.1]
# 重複を許可して 10 行を抽出
data2.sample(10, random_state=0, replace=True, weights=w)
ChatGPTにpandas.DataFrame.sample()の面白い使い方を教えてもらいました
[ChatGPT] pandas.DataFrame.sample() メソッドは、データフレームからランダムなサンプルを抽出するために使用されます。面白い使い方のいくつかを以下に示します。
1.データのランダムな表示: sample() メソッドを使って、データフレーム内のランダムな行を表示することができます。これは、データの概要を把握したり、ランダムなサンプルをチェックするのに便利です。例えば、次のコードはデータフレームからランダムに5つの行を表示します。
◆◆◆◆◆
import pandas as pd
df = pd.read_csv(‘data.csv’) # データフレームの読み込み
random_sample = df.sample(5) # ランダムな5つの行を抽出
print(random_sample)
◆◆◆◆◆
2.シャッフル: sample() メソッドには、シャッフルされたデータフレームを取得するオプションもあります。これは、データの並び順をランダムに変更したい場合に便利です。次のコードは、データフレームの行をシャッフルします。
◆◆◆◆◆
import pandas as pd
df = pd.read_csv(‘data.csv’) # データフレームの読み込み
shuffled_df = df.sample(frac=1) # データフレームの行をシャッフル
print(shuffled_df)
◆◆◆◆◆
3.重み付けされたサンプリング: sample() メソッドには、各行のサンプリング確率を重み付けするオプションもあります。これは、データセット内の特定の行により高い重みを持たせたい場合に役立ちます。例えば、次のコードは、’weight’ 列に基づいてデータフレームの行を重み付けサンプリングします。
◆◆◆◆◆
import pandas as pd
df = pd.read_csv(‘data.csv’) # データフレームの読み込み
weighted_sample = df.sample(n=5, weights=’weight’, replace=True) # 重み付けサンプリング
print(weighted_sample)
◆◆◆◆◆
これらは、pandas.DataFrame.sample() メソッドのいくつかの面白い使い方の例です。データフレームのランダムなサンプルを取得したり、データの並び順をシャッフルしたり、重み付けサンプリングを行ったりするために使用できます。必要に応じて、これらの例を自分のデータに適応させてみてください。