【Python】DataFrameの操作(1)

PythonのpandasにおけるDataFrame操作でよく使うものをまとめています。
サンプルコードはDataFrame例と照らし合わせながらご覧いただくとイメージしやすいかと思います。

DataFrame例

california_housing_test_head10
Google Colaboratory のサンプルデータから上位10件のみを抽出

データの抽出

df[0:1]

df[:1]

df.iloc[1]

▼結果

california_housing_test_行
▼備考
どの方法でも同じデータが取得できる。ただし、1番目・2番目はDataFrame型、3番目はSeries型になる点に注意。

df['longitude']

df.loc[:, ['longitude', 'total_bedrooms']]

▼結果

california_housing_test_列

任意条件
# housing_median_age列が「15.0」
df[df['housing_median_age'] == 15.0]

▼結果

california_housing_test_単一条件

以下の方法でも上記と同様の処理が可能。複数条件も指定できる。

df[df['housing_median_age'].isin([15.0, 19.0])]

▼結果

california_housing_test_isin

AND条件
# housing_median_age列が「40.0以上」 かつ total_rooms列が「1500.0未満」
df[(df['housing_median_age'] >= 40.0) & (df['total_rooms'] < 1500.0)]

▼結果

california_housing_test_複数条件

OR条件
# housing_median_age列が「40.0以上」 または total_rooms列が「1500.0未満」
df[(df['housing_median_age'] >= 40.0) | (df['total_rooms'] < 1500.0)]

▼結果

california_housing_test_OR条件

NOT条件
# housing_median_age列が「27.0以外」(以下、どちらでもOK)
df[~(df['housing_median_age'] == 27.0)]    # ~(チルダ)を使用
df[(df['housing_median_age'] != 27.0)]     # !=を使用

▼結果

california_housing_test_NOT条件

ランダム
# 全量の3割の件数をランダム抽出(実行のたびに異なる結果)
df.sample(frac=0.3)

# 全量の3割の件数をランダム抽出(何度実行しても同じ結果)
df.sample(frac=0.3, random_state=0)

▼結果

california_housing_test_ランダム
▼備考
指定した割合に対する抽出数は小数点以下切り捨てで実行される。 仮に全量が11件に対して、3割を指定した場合、抽出件数は「3件」になる。

行・列数の取得
print('行数:',df.shape[0])
print('列数:',df.shape[1])

▼結果

california_housing_test_行列数

任意のデータを削除

単一行の削除
# 行3を削除
df.drop(3)

▼結果

california_housing_test_行削除
「3行目」ではなく「行3」を削除している点に注意。

複数行の削除
# dfの行3と行5を削除
df.drop([3,5])

▼結果

california_housing_test_複数行削除

列の削除
# housing_median_age列を削除
df.drop("housing_median_age", axis=1)

▼結果

california_housing_test_列削除

任意のデータを追加

単一行の追加
# 行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']

▼結果

california_housing_test_行追加

複数行の追加
# カラム名のリストを準備
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)

▼結果

california_housing_test_複数行追加

単一列の追加
# name列を追加して「no_name」で初期化
df['name'] = 'no_name'

▼結果

california_housing_test_列追加

複数列の追加
# name列を追加して「no_name」で初期化、address列を追加して「no_address」で初期化
df.assign(name='no_name', address='no_address')

▼結果

california_housing_test_複数列追加

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