コンテンツにスキップ

Pandas Basic

データフレームの作成

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# DataFrameを作成
# Create DataFrame
dataframe = pd.DataFrame()

# 列を追加
dataframe['Name'] = ['Jacky Jackson', 'Steven Stevenson']
dataframe['Age'] = [38, 25]
dataframe['Driver'] = [True, False]

# データフレームを表示
dataframe

##########

# 行を作成
new_person = pd.Series(['Molly Mooney', 40, True], index=['Name','Age','Driver'])

# 行を追加
dataframe.append(new_person, ignore_index=True)

データフレームの操作(loc/iloc)

# -*- coding: utf-8 -*-
# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 最初の行を選択
dataframe.iloc[0]

############

# 3行を選択
dataframe.iloc[1:4]

############

# 4行を選択
dataframe.iloc[:4]

############

# インデックスを設定
dataframe = dataframe.set_index(dataframe['Name'])

# 行を表示
dataframe.loc['Allen, Miss Elisabeth Walton']

データの条件付きファイタリング

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 'sex'列が'female'の行のうち、最初の2行を表示
dataframe[dataframe['Sex'] == 'female'].head(2)

##########

# 行をフィルタリング
dataframe[(dataframe['Sex'] == 'female') & (dataframe['Age'] >= 65)]

データの入れ替え

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 値を置き換えて、最初の2行を表示
dataframe['Sex'].replace("female", "Woman").head(2)

##########

# "female"と"male"を"Woman"と"Man"にそれぞれ置き換える。
dataframe['Sex'].replace(["female", "male"], ["Woman", "Man"]).head(5)

##########

# 値を置き換えて、最初の2行を表示
dataframe.replace(1, "One").head(2)

##########

# 値を置き換えて、最初の2行を表示
dataframe.replace(r"1st", "First", regex=True).head(2)

列名の変更(rename)

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 列名を変更して, 最初の2行を表示
dataframe.rename(columns={'PClass': 'Passenger Class'}).head(2)

##########

# 列名を変更して, 最初の2行を表示
dataframe.rename(columns={'PClass': 'Passenger Class', 'Sex': 'Gender'}).head(2)

##########

# ライブラリをロード
import collections

# ディクショナリを作成
column_names = collections.defaultdict(str)

# キーを作成
for name in dataframe.columns:
    column_names[name]

# ディクショナリを表示
column_names

各統計量の表示

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 統計値を計算
print('Maximum:', dataframe['Age'].max())
print('Minimum:', dataframe['Age'].min())
print('Mean:', dataframe['Age'].mean())
print('Sum:', dataframe['Age'].sum())
print('Count:', dataframe['Age'].count())

##########

# カウント値を表示
dataframe.count()

値の総数/ユニークな値の表示

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# ユニークな値のリストを取得
dataframe['Sex'].unique()

##########

# 現れた回数を表示
dataframe['Sex'].value_counts()

##########

# カウント数を表示
dataframe['PClass'].value_counts()

##########

# ユニークな値の数を表示
dataframe['PClass'].nunique()

欠損値データの取扱(値の入れ替え)

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

## 欠損値を選択し、2つを表示
dataframe[dataframe['Age'].isnull()].head(2)

##########

# 値をNaNで置き換えることを試みる
dataframe['Sex'] = dataframe['Sex'].replace('male', NaN)

##########

# ライブラリをロード
import numpy as np

# 値をNaNで置き換える
dataframe['Sex'] = dataframe['Sex'].replace('male', np.nan)

##########

# 欠損値の表現を指定してデータをロード
dataframe = pd.read_csv(url, na_values=[np.nan, 'NONE', -999])

列の削除

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 列を削除
dataframe.drop('Age', axis=1).head(2)

##########

# 複数の列を削除
dataframe.drop(['Age', 'Sex'], axis=1).head(2)

##########

# 列を削除
dataframe.drop(dataframe.columns[1], axis=1).head(2)

##########

# 削除して新しいDataFrameを作成
dataframe_name_dropped = dataframe.drop(dataframe.columns[0], axis=1)

行の削除

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 行を削除して最初の2行を表示
dataframe[dataframe['Sex'] != 'male'].head(2)

##########

# 行を削除して最初の2行を表示
dataframe[dataframe['Name'] != 'Allison, Miss Helen Loraine'].head(2)

##########

# 行を削除して最初の2行を表示
dataframe[dataframe.index != 0].head(2)

重複の削除

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データを作成
dataframe = pd.read_csv(url)

# 重複した行を削除し、最初の2行を出力
dataframe.drop_duplicates().head(2)

##########

# 行数を表示
print("もとのDataFrame中の行数:", len(dataframe))
print("重複削除後の行数:", len(dataframe.drop_duplicates()))

##########

# 重複を削除
dataframe.drop_duplicates(subset=['Sex'])

##########

# 重複を削除
dataframe.drop_duplicates(subset=['Sex'], keep='last')

グループ別統計量の確認

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 'Sex'列の値で行をグループ分けし、グループごとの平均値を計算
dataframe.groupby('Sex').mean()

##########

# 行をグループ分け
dataframe.groupby('Sex')

##########

# 行をグループ分けし、行数をカウント
dataframe.groupby('Survived')['Name'].count()

##########

# 行をグループ分けし、平均値を計算
dataframe.groupby(['Sex','Survived'])['Age'].mean()

時刻によるグループ分け

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd
import numpy as np

# シード値を設定
np.random.seed(0)

# 日時の範囲を作成
time_index = pd.date_range('06/06/2017', periods=100000, freq='30S')

# DataFrameを作成
dataframe = pd.DataFrame(index=time_index)

# ランダムな値の行を作成
dataframe['Sale_Amount'] = np.random.randint(1, 10, 100000)

# 一週間ごとにグループ分けして、週ごとに値を集計

dataframe.resample('W').sum()

###########

# 3行表示
dataframe.head(3)

###########

# 2週間ごとにグループ分けして平均値を計算
dataframe.resample('2W').mean()

###########

# 月ごとにグループ分けして、行の数を数える
dataframe.resample('M').count()

###########

# 月ごとにグループ分けして、行の数を数える
dataframe.resample('M', label='left').count()

列アイテムへのループ処理

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 最初の2つの名前を大文字にして表示
for name in dataframe['Name'][0:2]:
    print(name.upper())

##########

# 最初の2つの名前を大文字にして表示
[name.upper() for name in dataframe['Name'][0:2]]

関数を適用した値の書き換え

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 関数を定義
def uppercase(x):
    return x.upper()

# 関数を適用して、結果の最初の2行を表示
dataframe['Name'].apply(uppercase)[0:2]

グループ分けして関数を適用

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://tinyurl.com/titanic-csv'

# データをロード
dataframe = pd.read_csv(url)

# 行をグループ分けし、関数をグループごとに適用
dataframe.groupby('Sex').apply(lambda x: x.count())

データフレームの連結(concat)

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# DataFrameを作成
data_a = {'id': ['1', '2', '3'],
          'first': ['Alex', 'Amy', 'Allen'],
          'last': ['Anderson', 'Ackerman', 'Ali']}
dataframe_a = pd.DataFrame(data_a, columns = ['id', 'first', 'last'])

# DataFrameを作成
data_b = {'id': ['4', '5', '6'],
          'first': ['Billy', 'Brian', 'Bran'],
          'last': ['Bonder', 'Black', 'Balwner']}
dataframe_b = pd.DataFrame(data_b, columns = ['id', 'first', 'last'])

# 行方向にDataFrameを連結
pd.concat([dataframe_a, dataframe_b], axis=0)

##########

# 列方向にDataFrameを連結
pd.concat([dataframe_a, dataframe_b], axis=1)

##########

# 行を作成
row = pd.Series([10, 'Chris', 'Chillon'], index=['id', 'first', 'last'])

# 行を追加
dataframe_a.append(row, ignore_index=True)

データフレームのマージ

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd

# DataFrameを作成
employee_data = {'employee_id': ['1', '2', '3', '4'],
                 'name': ['Amy Jones', 'Allen Keys', 'Alice Bees',
                 'Tim Horton']}
dataframe_employees = pd.DataFrame(employee_data, columns = ['employee_id',
                                                              'name'])

# DataFrameを作成
sales_data = {'employee_id': ['3', '4', '5', '6'],
              'total_sales': [23456, 2512, 2345, 1455]}
dataframe_sales = pd.DataFrame(sales_data, columns = ['employee_id',
                                                      'total_sales'])

# DataFrameをマージ
pd.merge(dataframe_employees, dataframe_sales, on='employee_id')

##########

# DataFrameをマージ
pd.merge(dataframe_employees, dataframe_sales, on='employee_id', how='outer')

##########

# DataFrameをマージ
pd.merge(dataframe_employees, dataframe_sales, on='employee_id', how='left')

##########

# DataFrameをマージ
pd.merge(dataframe_employees,
         dataframe_sales,
         left_on='employee_id',
         right_on='employee_id')

encoding形式エラーで読み込めないときの対応

#Action1
#cp932で読み込む
upload_data = pd.read_csv(upload_file, index_col=0, encoding="cp932")

#Action2
import codecs

#codecsでshift-JISで読み込む
with codecs.open("File_path", "r", "Shift-JIS", "ignore") as file:
    temp_data = pd.read_table(file, delimiter=",")

データタイプの変更

a["年齢"].astype(float)

新規カラム作成時の関数定義

#ageの関数を事前に定義しておく
titanic_train['Age02'] = titanic_train['Age'].apply(lambda x : age(x))

クロス表の作成

#縦%
pd.crosstab(resume['sex'], resume['race'], normalize = 'index')
#横%
pd.crosstab(resume['sex'], resume['race'], normalize = 'columns')

項目の文字入れ

#formatで入力
"He is my {}.".format("brother")

カラムの順序変更

df_receipt.reindex(columns=['sales_ymd','customer_id','product_cd','amount']).head(10)

特定の文字列を含む

#str.contain
df_store[df_store['store_cd'].str.contains('S14')].head(10)

特定の文字列で終わる

df_customer[df_customer['customer_id'].str.endswith('1')].head(10)

行をずらす

df_temp.shift()

列から行へ変換

df.stack()

項目の入れ替え

df.replace({"male": 00,"female":"01","unknown":"99"})

Datetimeの記載変更

pd.to_datetime(df_customer['birth_day']).dt.strftime('%Y%m%d')

文字列の入れ替え

df_customer["birth_day"].str.replace("-","")

UNIX秒の変換

pd.to_datetime(df_receipt['sales_epoch'], unit='s')

インデックスの重複削除

update_data = update_data.groupby(level=0).last()

文字列の分割

tv_kind = train_new['tv'].str.split("/",expand=True)

Pandasでの可視化

df.plot.scatter(x ="dwnom1", y="dwnom2", figsize =(8,8))

数値データのビン化

bins = [-np.inf, 25, 30, np.inf]
labels = ['LOW_TEMP', "MID_TEMP",'HIGH_TEMP']
df_2018['TEMP_GROUP'] = pd.cut(df_2018['MR_GT_T_airin'], bins, labels = labels)
df_2019['TEMP_GROUP'] = pd.cut(df_2019['MR_GT_T_airin'], bins, labels = labels)

ファイル操作

Excelファイルの読み込み

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/data.xlsx'

# データをロード
dataframe = pd.read_excel(url, sheetname=0, header=1)

# 最初の2行を表示
dataframe.head(2)

Jsonファイルの読み込み

# ライブラリをロード
import pandas as pd

# URLを作成
url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/data.json'

# データをロード
dataframe = pd.read_json(url, orient='columns')

# 最初の2行を表示
dataframe.head(2)

SQLクエリの読み込み

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd
from sqlalchemy import create_engine

# データベース接続を作成
database_connection = create_engine('sqlite:///sample.db')

# データをロード
dataframe = pd.read_sql_query('SELECT * FROM data', database_connection)

# 最初の2行を表示
dataframe.head(2)

複数列の文字列を連結して新たな列を作成

# -*- coding: utf-8 -*-

# ライブラリをロード
import pandas as pd
from sqlalchemy import create_engine

# データベース接続を作成
database_connection = create_engine('sqlite:///sample.db')

# データをロード
dataframe = pd.read_sql_query('SELECT * FROM data', database_connection)

# 最初の2行を表示
dataframe.head(2)

重複列の確認

import collections
l=list(train_x.columns)
print([k for k, v in collections.Counter(l).items() if v > 1])
Back to top