pandas

データフレームの作成

リストからデータフレームを作成

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が返される。引数inplaceTrueにすると元の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'>

データフレームの変換

リストをデータフレームに変換

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