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=",")
データタイプの変更
新規カラム作成時の関数定義
#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.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])