Python 「pandas」まとめ。テキストデータ処理の自動化で多用するコード一覧

'22/02/28更新:時間型(日付型)へ変換するコードを追記
 本記事では、pandas(パンダス)を活用したデータ処理の頻出操作の雛形コードを載せました。下図はpandasによるデータ操作の一例です。Excel(エクセル)のような表形式で、行列データを自由自在に操作することが出来ます。

f:id:HK29:20200913173652p:plain

備忘録として、カテゴリを次の5つに分けて逆引きできるように記載しています。
■1. データフレーム型を作成する(ファイルを読み込む、追記する、空を作成する)
■2. ファイルへ書き出す
■3. データフレームを調べる
■4. データを抽出する
■5. 列(カラム)を操作する

文中のcolumn_name_listは、次のようなリストを意味します。
column_name_list = ['列名1', '列名2', '列名3']

■1. データフレーム型を作成する(ファイル読んだり)

# excelを読み込む
df = pd.read_excel(file_path, sheet_name = 'Sheet1')

# csvを読み込む

df = pd.read_csv(file_path1, sep = ',', # タブの場合は'\t' index_col = 0, # インデックスを指定する場合は列番号 header = 0, # ヘッダーにしたい行の番号。ヘッダーがなく、数字にしたい場合はNone
skiprows = [1, 2], # スキップしたい行番号をリストで指定 #usecols = [0,2], # 特定の列を指定して読みたい場合。 #unecols = lambda x: x not in [] # 特定の列以外を読みたい場合 encoding = 'utf-8', # 'utf-8' 'shift_jis' 'cp932' # コーデックを指定して読みたい場合 ) # ファイル書式のコーデックエラーを無視して読み込む。import codecsで要インポート with codecs.open(file_path, mode='r', encoding='utf-8', errors='ignore') as f: df = pd.read_table(f, #delim_whitespace = True, delimiter = ' ', names = column_name_list, # 列名をリストで与える ) # リストからpandasのデータフレーム型へ変換する。列名もcolumnsでリストで与える df = pd.DataFrame(data_list, columns = column_name_list) # 空のデータフレームを作る。データ行は空で、列名は指定する場合 df = pd.DataFrame(index=[], columns=column_name_list)
# 列名をリストで作成する
column_name_list = (["dummy_{:02d}".format(x) for x in range(100)])
# データフレームを行方向へ追加する df3 = pd.concat([df, df2]) # データフレームを列方向へ追加する df3 = pd.concat([df, df2], axis=1)

■2. ファイルへ書き出す

# csvファイルへ書き出し(インデックス書き出さない場合はFalse、する場合はTrue)
    df.to_csv('data.csv',
              sep=',', # 区切り文字の指定。タブの場合は'\t'
              mode='w', # 追記したい場合は'a'
              index=False,
              #header=column_name_list # ヘッダーがないデータをヘッダー付きで書き出したい場合はリストで設定
#float_format='%.12e', # float型を指数表記。小数点以下を12桁の例 encoding='utf-8', )

■3. データフレームを調べる

# pandas データフレームの行数、列数を調べる
    row, col = df.shape

# 型を調べる
print(df.dtypes)
# 特定の列の要素の数を数える df = df.groupby('列名').size() # 要約統計量を調べる df = df.describe()

■4. データを抽出する

# 列名を指定してリスト化する
    mylist = df['列名'].values.tolist()

# クロス集計
    df = df.groupby('列名').count()

# 2つのdfとdf2で読み込み後、各々指定した列で重複する要素があるdfの行を抽出する
    df3 = df[df['列名'].isin(df2['列名2'])]

# 指定リスト内の要素がある行のみ残す
df2 = df[df['列名'].isin(
リスト)]
# 指定列の最小値、最大値を抽出する x_min = df['列名'].min() x_max = df['列名'].max()
# 数値型の指定列の各要素について、指定条件区間にある値の行を全て抽出する
df_extract = df[(df['列名'] >= 17) & (df['列名'] <= 25)]
# 特定の列の指定文字列がある行を抽出する df3 = df[df['列名'] == 'ほげほげ']

■5. 列(カラム)を操作する

# 列を追加する(全て同じ値の場合)
df['新列名'] = 0

# 列を追加する(リストで与えることができる。但し、列数と同じ要素数である必要がある)
df['新列名'] = リスト

# 列名をリネームする
  df = df.rename(columns={'列名': '新列名'})

# 列名を複数リネームする
  target_column_list = ['列名1', '列名2', '列名3']
  rename_column_list = ['列名A', '列名B', '列名C']

  df = df.rename(columns=dict(zip(target_column_list, rename_column_list)))

# 列名をリストで一括リネームする(列数とリストの要素数が異なればエラーとなる)
df.columns = ['新列名A', '新列名B', '新列名C']

# 列名を指定してソートする(並び替える)。リストで複数指定できる。
df = df.sort_values(['列名'], ascending=True) # インデックスを1からに変更する。numpyを利用する
df.index = np.arange(1, len(df) + 1)

# インデックスを列名指定で変更する。 df.set_index('列名', inplace=True) # インデックスをリセットする df.reset_index(drop=True, inplace=True) # 列をコピーして新たな列を作成する df['新列名'] = df['列名']
# 重複列を削除する(ひとつ残す)
df2 = df.loc[:,~df.columns.duplicated()]
# 指定列を削除する df2 = df.drop(['列名'], axis=1)
# 指定列を残す
df2 = df[['列名A', '列名B']]

# 欠損値がある列を削除する
df.dropna(axis = 1, inplace = True)


# 特定の列で欠損値がある行を削除する
df.dropna(subset=['列名'], inplaece = True)

# 新たに1からナンバリングしたリストを列として挿入する No_list = np.arange(1, len(df) + 1).tolist() df['列名'] = No_list # 列順を変更する(列番号) df = df.iloc[:, [5, 0, 1, 2, 3, 4]]
# 列順を変更する(列名)
df = df.loc[:, ('列名C', '列名A', '列名B')]

# 1列に対して演算
df['列名'] = df['列名'] * 1e9
# 2列の各行の和(足し算)を新規列に作成する df = df.assign(新列名 = [x + '_' + y for x, y in zip(df['列名1'], df['列名2'])]) # 指定列の全ての行に同じ文字列を挿入する df['新列名'] = df['列名'].apply(lambda x: f"入れたい文字列{x}") # データフレームを列方向に追記する df3 = pd.concat([df, df2], axis=1)
# 特定の列の型を変換する
df2 = df.copy() df2['列名'] = df['列名'].astype('str') # 'str' 'int' 'float' 'category'

# 特定の列の型を日付型(時間型)へ変換する
df['列名'] = pd.to_datetime(df['列名'])

# 全ての列の型を変換する
df = df.astype('str')


# float型のフォーマットを指数表記にする。小数点以下12桁の例
pd.options.display.float_format = '{:12e}'.format

# 列を指定して辞書を作成する
dic_colA_vs_colB = dict(zip(df['列名A'], df['列名B']))


# 指定した列に対して、上記の辞書で置換する
df2 = df.replace({'列名A': dic_colA_vs_colB})

以上

<広告>