データフレームの作成
リストからデータフレームを作成
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
import pandas as pd
df = pd.DataFrame(l)
print(df)
# 0 1 2
# 0 1 2 3
# 1 4 5 6
# 2 7 8 9
列名・行名を指定
df = pd.DataFrame(l, columns=['col_1', 'col_2', 'col_3'],
index=['idx_1', 'idx_2', 'idx_3'])
print(df)
# col_1 col_2 col_3
# idx_1 1 2 3
# idx_2 4 5 6
# idx_3 7 8 9
行・列を転置
df = pd.DataFrame(l, columns=['col_1', 'col_2', 'col_3'],
index=['idx_1', 'idx_2', 'idx_3'])
df = df.T
print(df)
# idx_1 idx_2 idx_3
# col_1 1 4 7
# col_2 2 5 8
# col_3 3 6 9
辞書からデータフレームを作成
import pandas as pd
d = [
{'A': '11', 'B': '12', 'C': '13'},
{'A': '21', 'B': '22', 'C': '23'},
{'A': '31', 'B': '32', 'C': '33'}
]
df = pd.DataFrame(d)
print(df)
# A B C
# 0 11 12 13
# 1 21 22 23
# 2 31 32 33
CSVの読み込み
headerがあるcsvの読み込み
a,b,c,d
11,12,13,14
21,22,23,24
31,32,33,34
import pandas as pd
df = pd.read_csv('sample.csv')
print(df)
# a b c
# 0 11 12 13
# 1 21 22 23
# 2 31 32 33
行をスキップ(除外)して読み込み
- 指定した行がヘッダーになる
df = pd.read_csv('sample.csv', header=2)
print(df)
# 21 22 23
# 0 31 32 33
データフレームの読み込み・値を取得
上からn行を取得
# 上から5行を取得
df.head(5)
特定の行・列を取得
# 列を取得
df = df['col_A']
# 複数列を取得
df = df[['col_A', 'col_B']]
# 行を取得
df = df[1:4]
https://note.nkmk.me/python-pandas-index-row-column/
特定の値を持つ行を抽出
df = df[df['col_1'].isin(['A2'])]
特定の文字列を含む行を抽出
完全一致の行を抽出
df = df[df['col_1'] == 'Keyword']
特定の文字を含む行を抽出
df = df[df['col_1'].str.contains('Keyword')]
データフレームを編集
カラム名を変更
col_rename = {'a': 'A', 'b': 'B', 'c': 'C'}
print(df)
# a b c
# 0 11 12 13
# 1 21 22 23
# 2 31 32 33
df = df.rename(columns=col_rename)
print(df)
# A B C
# 0 11 12 13
# 1 21 22 23
# 2 31 32 33
新規に列を追加
df['D'] = ''
# A B C D
# 0 11 12 13
# 1 21 22 23
# 2 31 32 33
- 任意の値を入れることも可能
- 指定した値が全行に入る
df['D'] = 'd'
# A B C D
# 0 11 12 13 d
# 1 21 22 23 d
# 2 31 32 33 d
列を削除
列を削除(カラム名指定)
df = df.drop(columns=['col_1'])
列を削除(列番号指定)
df = df.drop(columns=df.columns[[1, 2]])
- デフォルトでは元の
DataFrame
は変更されず、新しいDataFrame
が返される。引数inplace
をTrue
にすると元のDataFrame
が変更される。
df = df.drop(columns=['col_1'], inplace=True)
行を削除
行を削除(行ラベル名指定)
df = df.drop(index=['col_1'])
行を削除(行番号指定)
df = df.drop(index=df.index[[1, 2]])
特定の行・列に空白(欠損値NaN)がある列・行を削除
df = df.dropna(subset=['col_1'])
特定の文字列を含む行の他のカラムの値を更新
df.loc[df['col_1'].str.contains('Keyword'), 'col_2'] = 'value contain'
特定の列のセルの文字列を置換
df['col_1'] = df['col_1'].str.replace('before', 'after')
列全体の値を書き換え
df.col_1 = df.col_1.replace('publish', 'trash')
重複した行の処理
重複した行の数をカウント
print(df.duplicated().sum())
重複した行を削除: drop_duplicates()
# 列を選択して重複行削除
df = df.drop_duplicates(subset='col_1')
# 重複した最後の行を残す(デフォルトは最初の行が残る)
df = df.drop_duplicates(keep='last')
# 重複した行をすべて削除
df = df.drop_duplicates(keep=False)
カラムの並び順を変更
df = df.reindex(columns=['col_D','col_A','col_C','col_B'])
データフレームをソートして並び替え
カラム名を指定してソート
# 昇順で並び替え
df = df.sort_values('col_1')
# 降順で並び替え
df = df.sort_values('col_1', ascending=False)
複数列を基準にソート
df = df.sort_values(['col_1', 'col_2'])
# 昇順・降順を指定して並び替え
df = df.sort_values(['col_1', 'col_2'], ascending=[True, False])
VLOOKUP的な検索を行う
# csvファイル読み込み
# 編集ファイル
df = pd.read_csv('sample.csv',\
# 列を選択してリスト化
usecols=['col_1','col_2','col_3','col_4']).values.tolist()
# VLOOKUPを使って検索対象となるcsvファイル読み込み・リスト化
# データベースファイル
vlookup = pd.read_csv('vlookup.csv').values.tolist()
for d in df:
for v in vlookup:
if v[0] == d[3]: ## データベースファイル1列目と編集ファイル4列目の値が同じ場合
d[1] = v[2] ## 編集ファイル2列目にデータベースファイル3列目の値を入力する
データフレームを連結する
# dfを結合させるためのリスト
df_array = []
# df結合リストにdfを格納
df_array.append(df_1)
df_array.append(df_2)
# dfを結合
df = pd.concat(df_array, ignore_index=True)
特殊な値
nan を除外
import numpy as np
if value is np.nan:
# 値が nan の場合
if not value is np.nan:
# 値が nan でない場合
もしくは
import math
math.isnan("判定したい値") # nanの時True
数値の小数点以下を削除
num = 1.0
num = '{:.0f}'.format(num)
print(num) # 1
print(type(num)) # <class 'str'>
- 数値は「四捨五入」になる点に注意
- Python, formatで書式変換(0埋め、指数表記、16進数など) | note.nkmk.me
データフレームの変換
リストをデータフレームに変換
list_1 = ['a', 'b', 'c']
df = pd.DataFrame(list_1)
print(df)
# 0
# 0 a
# 1 b
# 2 c
list_2 = [['a', 'b', 'c'], ['d', 'e', 'f']]
df = pd.DataFrame(list_2)
print(df)
# 0 1 2
# 0 a b c
# 1 d e f
df = pd.DataFrame(list_2, columns=['col1', 'col2', 'col3'])
df = df.to_string(index=False) # インデックスを削除
print(df)
# col1 col2 col3
# a b c
# d e f
辞書をデータフレームに変換
dict_data = [{'name': 'Tanaka', 'age': 25}, {'name': 'Satou', 'age': 36}]
df = pd.DataFrame(dict_data)
データフレームをリストに変換
df = df.values.tolist()
データフレームを辞書に変換
df = df.to_dict()
列を指定して辞書に変換
df = df['col_1'].to_dict()
行・列を転置して辞書に変換
df = df.to_dict(orient='index')
csvファイル読み込み
df = pd.read_csv('import.csv')
列を選択してcsvファイル読み込み
df = pd.read_csv('import.csv', usecols=['col_1','col_2','col_3'])
csvファイル書き出し
df.to_csv('csv/export.csv')
ヘッダーなし
df.to_csv('csv/export.csv', header=False)
インデックスなし
df.to_csv('csv/export.csv', index=False)
特定の列のみ書き出し
df.to_csv('csv/export.csv', columns=['col_1'])
ShiftJIS形式で書き出し
df.to_csv('csv/export.csv', encoding='cp932')
ファイル名に日付を追加
import datetime
import time
FILE_DATE_TODAY = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
df.to_csv('csv/output-' + FILE_DATE_TODAY + '.csv', index=False)
csvファイル結合
import glob
import pandas as pd
files = sorted(glob.glob('*.csv'))
csv_list = []
for file in files:
csv_list.append(pd.read_csv(file))
# csv_list.append(pd.read_csv(file, encoding='shift_jis'))
merge_csv = pd.concat(csv_list)
merge_csv.to_csv('merge.csv', index=False)
# merge_csv.to_csv('merge.csv', index=False, encoding='shift_jis')