【python】DataFrameの統計量

DataFrameのデータの計算や統計の方法。



#各モジュールをインポートする
import pandas as pd
import numpy as np
from pandas import Series, DataFrame

#テスト用のDataFrameの作成
data = np.array([[1,2,np.nan], [np.nan, 3, 4, ]])
dframe = DataFrame(data, index=['A','B'], columns=['col1', 'col2', 'col3'])

いろいろな計算方法

#足し算
dframe1.sum()

#出力結果
col1    1.0
col2    5.0
col3    4.0
dtype: float64



#行方向に足し算
dframe1.sum(axis=1)

#出力結果
A    3.0
B    7.0
dtype: float64


#累計
dframe1.cumsum()

#出力結果
	col1	col2	col3
A	1.0	2.0	NaN
B	NaN	5.0	4.0

平均や分散などをまとめて表示する

dframe1.describe()

#出力結果
	col1	col2  	col3
count	1.0	2.000000	1.0  #個数
mean	1.0	2.500000	4.0  #平均値
std	NaN	0.707107	NaN  #標準偏差
min	1.0	2.000000	4.0  #最小値
25%	1.0	2.250000	4.0  #25%
50%	1.0	2.500000	4.0  #50%
75%	1.0	2.750000	4.0  #75%
max	1.0	3.000000	4.0  #最大値

【python】DataFrameの並び替え

pandasのDataFrameの並び替えの方法について。
DataFrame.sort()ではエラーになってしまったので調べてみると、
0.19.0以降のバージョンからメソッドが削除されていて、
並び替えをするにはsort_values(), sort_index()を使用する必要がある。


まずはnumpyとpandasのインポート。

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

#ランダムなデータを作るために、randnもインポート
from numpy.random import randn

sort_values(), sort_index()での並び替え

テスト用のDataFrameの作成

#randnを使用して、ランダムな5*3のDataFrameを作成
dframe = DataFrame(randn(15).reshape((5,3)) ,index=['A','C','D','B','E'],columns=['col1','col2','col3'])

#出力結果
	col1    	col2    	col3
A	1.065672	1.747904	0.035748
C	0.955697	0.472874	0.463158
D	0.286586	-0.695141	0.856504
B	-1.279603	0.537965	-1.070702
E	1.100331	0.165572	-1.151672

sort_values()

sort_value()では、「by=''」で列を指定し、対象列を基準に並び替えされる。
降順にする場合は、ascending=Falseを指定する。

#sort_value()では、「by=''」で列を指定する
dframe.sort_values(by='col2')

#出力結果
	col1  	col2  	col3
D	0.286586	-0.695141	0.856504
E	1.100331	0.165572	-1.151672
C	0.955697	0.472874	0.463158
B	-1.279603	0.537965	-1.070702
A	1.065672	1.747904	0.035748


#降順にする場合は、ascending=Falseを指定する
dframe.sort_values(by='col2', ascending=False)

#出力結果
	col1  	col2  	col3
A	1.065672	1.747904	0.035748
B	-1.279603	0.537965	-1.070702
C	0.955697	0.472874	0.463158
E	1.100331	0.165572	-1.151672
D	0.286586	-0.695141	0.856504


#列の並び替えはaxis=1を指定する
dframe.sort_values(by='B', axis=1)

#出力結果
	col1  	col3  	col2
A	1.065672	0.035748	1.747904
C	0.955697	0.463158	0.472874
D	0.286586	0.856504	-0.695141
B	-1.279603	-1.070702	0.537965
E	1.100331	-1.151672	0.165572

sort_index()

sort_index()も同様に並び替えが出来る。
「by=''」は必要ない。

#indexで並び替え
dframe.sort_index()

#出力結果
	col1    	col2    	col3
A	1.065672	1.747904	0.035748
B	-1.279603	0.537965	-1.070702
C	0.955697	0.472874	0.463158
D	0.286586	-0.695141	0.856504
E	1.100331	0.165572	-1.151672



#columnで並び替え
dframe.sort_index(axis=1, ascending=False)

#出力結果
    col3    	col2  	col1
A	0.035748	1.747904	1.065672
C	0.463158	0.472874	0.955697
D	0.856504	-0.695141	0.286586
B	-1.070702	0.537965	-1.279603
E	-1.151672	0.165572	1.100331

まとめ

DataFrameは、sort_index(), sort_values()で並び替えが出来る。

【python】スペース有無, 順番違いのキーワード重複の削除

派遣 事務 求人
派遣 事務
求人 事務 派遣
事務 求人
事務派遣

などのキーワードから、スペース有無や順番違いのキーワードを除外したい。

▼アウトプットイメージ
派遣 事務 求人
派遣 事務
事務 求人

キーワード重複の削除

下準備

#numpyのインポート
import numpy as np

#キーワードを配列に代入。
keywords = ['派遣 事務 求人', '派遣 事務','求人 事務 派遣','事務 求人']

#キーワード整形用の関数を作成
def shaping_kw(keyword):
    split_kw = keyword.split(' ') #キーワードをスペースで分割
    sorted_kw = sorted(split_kw) #分割したキーワードを並び替え
    join_kw = ''.join(sorted_kw) #並び替えたキーワードを連結
    return join_kw

#shaping_kwを、keywordsの値に実行
shaped_keywords = list(map(lambda keyword:shaping_kw(keyword),keywords))

#shaped_keywords
['事務求人派遣', '事務派遣', '事務求人派遣', '事務求人', '事務派遣']

重複を削除したキーワードの取り出し

#numpyのunique()を使用して、ユニークなキーワードを取り出す
np.unique(shaped_keywords)
実行結果
array(['事務求人', '事務求人派遣', '事務派遣'],dtype='<U6')

まとめ

スペース有無,前後の順番が違うキーワードは下記の手順で重複除外出来る。
①スペースで分割
②分割したキーワードの並び替え
③並び替えたキーワードを連結
④numpyのunique()で、ユニークな値だけ取り出す


このままのデータだと、キーワード調査とかには活用出来ないので
整形前のキーワードを残した上で重複を除外する方法を考えないと・・。


2017/11/03追記:AdWordsのデータから、整形後データのCSV出力まで一気にする方法が分かった
otoha0510.hatenablog.com

【python】DataFrame, Seriesの計算

いつも通り、numpy , pandasのインポート。

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

Seriesの計算

#テスト用のシリーズの作成
series1 = Series([1,2,3],index=['A','B','C'])
series2 = Series([2,0,5,8],index=['B','C','D','E'])

足し算

series1 + series2

#出力結果
A    NaN
B    4.0
C    3.0
D    NaN
E    NaN
dtype: float64

series1,series2の両方にインデックスが存在している「B,C」は数値が足し算される。
インデックスが共通になっていないA,D,Eについては、NaNになる。

共通のインデックスが無い場合に数値を埋める

series1.add(series2, fill_value=0)

#出力結果
A    1.0
B    4.0
C    3.0
D    5.0
E    8.0
dtype: float64

「fill_value=0」を指定する事で、共通していないインデックスを埋める事ができる。


DataFrameの計算

#テスト用のDataFrameの作成
dframe1 = DataFrame(np.arange(4).reshape((2,2)), columns=['col1','col3'], index=['B','D'])
dframe2 = DataFrame(np.arange(9).reshape((3,3)), columns=['col1','col2','col3'], index=['A','B','C'])

足し算

dframe1 + dframe2

#出力結果
    col1	col2	col3
A	NaN	NaN	NaN
B	3.0	NaN	6.0
C	NaN	NaN	NaN
D	NaN	NaN	NaN

Series同様に、共通している箇所のみが足し算される。

共通のインデックスが無い場合に数値を埋める

dframe1.add(dframe2, fill_value=0)

#出力結果
        col1	col2	col3
A	0.0	1.0	2.0
B	3.0	4.0	6.0
C	6.0	7.0	8.0
D	2.0	NaN	3.0

こちらもSeries同様に、「fill_value=0」を指定すると数値を埋める事が出来る。
dframe1,dframe2の両方に数値がない箇所はNaNで表示される。

【python】DataFrameのデータ取り出し

pandasとnumpyのインポート。
また、pandasからSeriesとDataFrameもインポートする。

import pandas as pd
import numpy as np
from pandas import Series, DataFrame

テスト用のDataFrameを作成

dataframe1 = DataFrame(np.arange(15).reshape(5,3), index=['A','B','C','D','E'], columns=['col1','col2','col3'])

インデックス・行を指定して取り出し

#行を指定して取り出し
dataframe1.ix[1]

#インデックスを指定して取り出し
dataframe1.ix['C']

実行結果

#行を指定して取り出し
col1    3
col2    4
col3    5
Name: B, dtype: int32


#インデックスを指定して取り出し
col1    6
col2    7
col3    8
Name: C, dtype: int32

条件を満たすデータのみ取り出し

特定の列が値を満たす場合のみ取り出す

dataframe1[dataframe1['col2']>8]

dataframe1のcol2の値が8より大きい場合のみを対象にする。

実行結果

    col1	col2	col3
D	9	10	11
E	12	13	14

【python】DataFrameやSeriesでの行・列の削除

pandasとnumpyのインポート。
また、pandasからSeriesとDataFrameもインポートする。

import pandas as pd
import numpy as np
from pandas import Series, DataFrame

シリーズの場合

テスト用のシリーズを作成

series1 = Series(np.arange(5), index=['A','B','C','D','E'])

行の削除

series1.drop('C')

Seriesの行削除はdropで行う。
インデックスを指定する事で、行の削除が可能

実行結果

A    0
B    1
D    3
E    4
dtype: int32

DataFrameの場合

テスト用のDataFrameを作成

dataframe1 = DataFrame(np.arange(9).reshape(3,3), index=['A','B','C'], columns=['col1','col2','col3'])

行の削除

dataframe1.drop('A')

Series同様にdropで削除が可能。

実行結果

	col1	col2	col3
B	3	4	5
C	6	7	8

列の削除

dataframe1.drop('col2',axis=1)

列の削除を行う場合は、axis=1を指定する。

実行結果

	col1	col3
A	0	2
B	3	5
C	6	8