Designer*
Hamanaka Miho

Blog

【Python】Pandas practice

去年11月にスクールで習ったPandasのまとめ。
いつか、何かに役立つかと、備忘録。


date-written: 2019.11.08

Colaboratoryのにゃんにゃんは、
11月はずっとハロウィンのようで、毎日愉快な勉強できているこの頃です。

ここ最近、午前中はPython。
この前、Pandas勉強したので。せっかく勉強したから忘れる前に、備忘録。
CSVデータをエクセルで動かすのをPythonで復習。


Pandasまとめ

・Pythonのライブラリ、データの前処理に使う便利ライブラリ。
・データに「インデックス」をつけて表示できる。
・1,Series 2,DataFrameの2種類ある。

—–
1, Series
 DataFrameが1つのカラム(一次元)を指すデータ構造

2, DataFrame
 DataFrameが二次元のデータ構造
—–


pandasの読み込み

import pandas as pd

#pandas使うと、インデックスがついになった配列となる。
sample_pandas_data = pd.Series([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

sample_pandas_data
データに0〜インデックスがついた。

こういうimportもある↓
が、Numpyとこんがらがらないよう、pd.つけたやり方がよさそう。

#pandasのシリーズとデーターフレームを使いますよ。
from pandas import Series, DataFrame

#fromで読み込むと、下記の.pd省略できる
sample_pandas_data = Series([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])


1,Series

・一次元のデータ構造
・.Series()関数

[インデックス指定なし]

#インデックス指定なしのSeries
sample_pandas_data = pd.Series([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

sample_pandas_data

指定しないと、さっきの0〜インデックスつく

ちなみに、通常のpythonのリストだと・・・

#通常のpython 上記のpdとの違い、インデックスは表示されない。 
py = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 

py 

インデックス表示されない

[インデックス指定あり]

# 引数にインデックス指定できる
#.Series()関数の中に宣言。辞書みたいなカタチだね。
sample_pandas_index_data = pd.Series([0, 10, 20, 30, 40, 50, 60, 70, 80, 90],
                           index=['a','b','c','d','e','f','g','h','i','j'])

sample_pandas_index_data

第二引数に、好きなインデックス指定できる

2,DataFrame

・二次元のデータ構造
・DataFrame()関数
・リスト型のバリューを持ったディクショナリか、Numpy配列を使用できる。
・Seriesと同じように自動的にインデックスされる。

****************

CSVデータをリストにして、インデックスつける想定で、
2データを作成(架空データ)し、練習。

****************

[データ1作成]

#データ1作成 #第二引数に、インデックス指定できる。 
shop_data = [['01','02','03','04','05'], 
            ['近藤智子','加藤俊明','森明子','鈴木花子','中村友和'], 
            ['F','M','F','F','M'], 
            [30,48,29,39,55]] 

shop_data_frame = pd.DataFrame(shop_data, 
                               index =['ID','name','sex','age']) 

#引数に指定したインデックスは、行に入るので、.Tで転置。 
data_1= shop_data_frame.T 
data_1
[データ1] .Tメソッドは、行列操作の転置

[データ2作成]

#データ2作成 
shop_data2 = [['01','02','03','04','05'], 
             ['リング','ネックレス','ブライダルリング','ピアス','ネックレス'], 
             [46000,35000,230000,12000,43500], [40,300,25,10,200]] 


shop_data2_frame = pd.DataFrame(shop_data2, index= ['ID', 'product','price','point']) 

data_2 = shop_data2_frame.T 
data_2
[データ2]

[データの結合]

#merge id名が重なっている同士が重なる 
#データ1とデータ2の結合 
merge_data = pd.merge(data_1,data_2) 

merge_data
merge_data データ1+データ2の結合

[インデックスの追加]

#Seriesの代入 shopを追加してみる 
val = pd.Series(['表参道','渋谷','新宿','新宿', '渋谷'], index=[0,1,2,3,4]) 

merge_data['shop'] =val merge_data 

#ちなみに削除は、 del 
#del merge_data['shop']
merge_dataに、shopデータの追加

[インデックスの並び替え:.reindex()]

#.reindex()インデックスの並び順が変更できるよ 
merge_data.reindex(columns=['ID', 'shop','product','price','point','name','sex', 'age'])
.reindex()インデックスの並び順が変更

[インデックス名を変更:.rename() ]

#.rename() インデックス名を日本語名に変更してみる 
merge_data.rename (columns = {'ID':'id', 'name':'名前', 'sex':'性別', 'age': '年齢', 'product': '商品名', 'price': '購入額','point': 'ポイント'})
.rename() インデックス名を日本語名に変更

[merge_dataから、要素抽出]

—————-
**loc属性**

#loc [id:id,'インデックス名':'インデックス名'] 
#行をidで指定、列はラベル名(インデックス)で指定 merge_data.loc[1:3,'name':'point']
ラベルで指定して、スライス。終点に指定した値も範囲に含まれる。

—————-
**iloc属性**

#項目は考えないで、0から数えて指定 #1:3は、1~2まで抽出ってこと。 merge_data.iloc[1:3, 1:3]
NumPyでのスライス表記と同様。終点に指定した端点が含まれない。
#2:空欄 は、2~全部ってこと。 
merge_data.iloc[2:,3:]
2~全部表示

—————-
**属性使わずに列データ抜き出す**

#.インデックスでshop列を全部取り出せるが、
#Jupyter特有の記述方法で、使わない方が賢明とのこと
merge_data.shop

#特定の列の抽出は列のキーを指定 ['インデックス']
#上と同じ結果 単一のブラケットで囲むとSeries型になる
merge_data['shop']
上二つ下記結果
#単数取り出しも、二次元(ブラケット二つつける)と表になる。 
# ブラケットで2重に囲むDataFrame型になるから 
merge_data[['shop']]

shop列の表参道のみ取り出す

#Series型で取得 
merge_data['shop'][0] 

#DataFrame型で取得、これも出るけど複雑なのは使いたくないね、 
merge_data[['shop'][0]][0]]]

name列とproduct列を取り出す

# 配列のカタチになっているね 
merge_data [['name','product']]

—————-
**.isin()**

#男性の購入者 
merge_data [merge_data['sex'].isin(['M'])]
.isin() DataFrameの各要素が引数に入れたリストや辞書の値に含まれるかどうか調べてくれる

—————-
**比較演算子使う**

#購入金額が4万円以上の人 
merge_data [merge_data ['price'] >= 40000]
購入金額が4万円以上の人

—————-
**集計:groupby()**
groupby()を使うとグループ集計できる

**合計:.sum()**

#各ショップの合計金額 
merge_data.groupby('shop')['price'].sum()
グループ集計 groupby() + 合計 .sum()

—————-
**平均:.mean()**

#.mean()したら、numericじゃないよエラーに。なぜ? 
#pythonのリストはpandasだと Numpy配列になり、数値がnumericじゃなくなのか? 
#いろいろ調べて、教わって、numeric_only = Noneをしてエラーなくなる。。。うむむ。 

merge_data.groupby('shop')['price'].mean(numeric_only = None)
平均

—————-
**指定した値でソート:sort_values()**

#購入額高い順 merge_data.sort_values(by=["price"],ascending=False) 
#ascending=True (値が小さい順) 
#ascending=False 降順(値が大きい順)
:sort_values() 購入額高い順

—————-
**先頭から指定した行を表示:head()**

#指定しないと5行表示になる 
merge_data.head(3)

—————-
**終わりから指定した行を表示:tail()**

#指定しないと5行表示になる 
merge_data.tail(3)

—————-
[merge_dataから、要素削除]

**削除:drop**
axisの値が、
・0なら行
・1なら列

#shop列の削除
merge_data.drop(['shop'], axis = 1)
[/python]

#加藤さんの行を削除
merge_data.drop([1], axis = 0)
備忘録 おわり。