【Python】DataFrameの操作(1)
PythonのpandasにおけるDataFrame操作でよく使うものをまとめています。
サンプルコードはDataFrame例と照らし合わせながらご覧いただくとイメージしやすいかと思います。
DataFrame例
データの抽出
行
df[0:1] df[:1] df.iloc[1]
▼結果
▼備考
どの方法でも同じデータが取得できる。ただし、1番目・2番目はDataFrame型、3番目はSeries型になる点に注意。
列
df['longitude'] df.loc[:, ['longitude', 'total_bedrooms']]
▼結果
任意条件
# housing_median_age列が「15.0」 df[df['housing_median_age'] == 15.0]
▼結果
以下の方法でも上記と同様の処理が可能。複数条件も指定できる。
df[df['housing_median_age'].isin([15.0, 19.0])]
▼結果
AND条件
# housing_median_age列が「40.0以上」 かつ total_rooms列が「1500.0未満」 df[(df['housing_median_age'] >= 40.0) & (df['total_rooms'] < 1500.0)]
▼結果
OR条件
# housing_median_age列が「40.0以上」 または total_rooms列が「1500.0未満」 df[(df['housing_median_age'] >= 40.0) | (df['total_rooms'] < 1500.0)]
▼結果
NOT条件
# housing_median_age列が「27.0以外」(以下、どちらでもOK) df[~(df['housing_median_age'] == 27.0)] # ~(チルダ)を使用 df[(df['housing_median_age'] != 27.0)] # !=を使用
▼結果
ランダム
# 全量の3割の件数をランダム抽出(実行のたびに異なる結果) df.sample(frac=0.3) # 全量の3割の件数をランダム抽出(何度実行しても同じ結果) df.sample(frac=0.3, random_state=0)
▼結果
▼備考
指定した割合に対する抽出数は小数点以下切り捨てで実行される。
仮に全量が11件に対して、3割を指定した場合、抽出件数は「3件」になる。
行・列数の取得
print('行数:',df.shape[0]) print('列数:',df.shape[1])
▼結果
任意のデータを削除
単一行の削除
# 行3を削除 df.drop(3)
▼結果
複数行の削除
# dfの行3と行5を削除 df.drop([3,5])
▼結果
列の削除
# housing_median_age列を削除 df.drop("housing_median_age", axis=1)
▼結果
任意のデータを追加
単一行の追加
# 行100を追加し、全ての列を「0」で初期化する。 df.loc['100'] = 0 # 行1000を追加し、列を指定の値で初期化する。 df.loc['1000'] = ['-200.01', '35.5', '19.5', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0']
▼結果
複数行の追加
# カラム名のリストを準備 col_list = ["longitude", "latitude", "housing_median_age"] # 追加行のDataFrameを準備 df_add = pd.DataFrame(data = [['-300.03', '32.09', '20.2'],['-400.04', '23.05', '17.4']], columns = col_list) # 元DataFrameに追加DataFrameを連結 df = df.append(df_add, ignore_index = True)
▼結果
単一列の追加
# name列を追加して「no_name」で初期化 df['name'] = 'no_name'
▼結果
複数列の追加
# name列を追加して「no_name」で初期化、address列を追加して「no_address」で初期化 df.assign(name='no_name', address='no_address')
▼結果
DataFrameのファイル出力
CSV出力
' DataFrameの1行を1つのcsvファイルに出力 for i in df.index: df.iloc[i].to_csv('./sample_data/output/' + str(i) + '.csv')
テキスト出力
' DataFrameの1行を1つのテキストファイルに出力 for i in df.index: path = './sample_data/output/' + str(i) + '.txt' f = open(path, mode = 'w') f.write(str(df['longitude'][i])) f.close()