データ科学パッケージ-Day 2-pandas(二)
54838 ワード
文書ディレクトリ映画データ分析 データ読み出し データ統合 コアデータ構造 Series ndarayから作成 辞書から作成 スカラーから作成 Seriesはクラスndarrayオブジェクト です. Seriesはクラス辞書オブジェクト です.ラベル整列動作 nameプロパティ DataFrame 辞書から作成 構造化データから を作成する.ディクショナリリストから作成 タプル辞書から作成 Seriesから作成 列選択/追加/削除 assign()メソッドを使用して、新しい列 を挿入するインデックスおよび選択 データ整列 numpy関数 を使用 Panel
映画データ解析
Pandasによる映画採点データの分析データ読み出し データ統合 統計映画平均得点 アクティブ映画を集計->採点された回数が多いほど、映画がアクティブになる 女子が一番好きな映画ランキング 男子が一番好きな映画ランキング 男女の採点差が最も大きい映画->ある映画の女子学生は好きだが、男子学生は が好きではない.最も論争のある映画ランキング->採点の分散最大
データ読み込み
データの結合
コアデータ構造
Series
Seriesは1次元ラベル付き配列で,配列に任意のデータ(整数,浮動小数点数,文字列,Python Object)を入れることができる.基本的な作成関数は次のとおりです.
s=pd.Series(data,index=index)では、indexはデータのラベルとして使用されるリストです.dataは、異なるデータ型であってもよい. Python辞書 ndarrayオブジェクト スカラー値、例えば5 ndarayから作成
辞書から作成
スカラーから作成
Seriesはクラスndarrayオブジェクトです
Seriesはクラス辞書オブジェクトです
ラベルの整列
nameプロパティ
DataFrame
DataFrameは、2 D行ラベルと列ラベルの配列です.DataFrameをExcelテーブルやSQLデータベースのテーブルにしたり、Seriesオブジェクト辞書にしたりすることができます.Pandasで最もよく使われるデータ構造です.
DataFrameを作成する基本形式は次のとおりです.
df=pd.DataFrame(data,index=index,columns=columns)indexは行ラベル、columnsは列ラベル、dataは次のデータです.一次元numpy配列,list,Seriesからなる辞書 二次元numpy配列 Series 別のDataFrameオブジェクト 辞書から作成
構造化データから作成
辞書リストから作成
タプル辞書から作成
Seriesから作成
列の選択/追加/削除
assign()メソッドを使用して新しいカラムを挿入
索引と選択
対応するアクション、構文、および結果の戻し
列を選択->df[col]->Series行ラベルから行を選択->df.loc[label]->Series行位置から行を選択->df.iloc[label]->Series行を選択->df[5:10]->DataFrameブールベクトルから複数行を選択->df[bool_vector]->DataFrame
データの配置
numpy関数の使用
Panel
Panelは3 Dラベル付き配列です.実際,Pandasの名称の由来はPanelによって進化したもの,すなわちpan(el)−da(ta)−sである.Panelは比較的少ないが、依然として最も重要な基礎データ構造の一つである.
items:座標軸0、インデックス対応要素はDataFrame major_axis:座標軸1,DataFrameの行ラベルminor_axis:座標軸2,DataFrameの列ラベル
映画データ解析
Pandasによる映画採点データの分析
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
データ読み込み
user_names = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=user_names, engine='python')
rating_names = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rating_names, engine='python')
movie_names = ['movie_id', 'title', 'genres']
movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=movie_names, engine='python')
print len(users)
users.head(5)
print len(ratings)
ratings.head(5)
print len(movies)
movies.head(5)
データの結合
data = pd.merge(pd.merge(users, ratings), movies)
len(data)
data.head(5)
data[data.user_id == 1]
#
mean_ratings_gender = data.pivot_table(values='rating', index='title', columns='gender', aggfunc='mean')
mean_ratings_gender.head(5)
# -> /
mean_ratings_gender['diff'] = mean_ratings_gender.F - mean_ratings_gender.M
mean_ratings_gender.head(5)
mean_ratings_gender.sort_values(by='diff', ascending=True).head(10)
#
ratings_by_movie_title = data.groupby('title').size()
ratings_by_movie_title.head(5)
# ->
top_ratings = ratings_by_movie_title[ratings_by_movie_title > 1000]
top_10_ratings = top_ratings.sort_values(ascending=False).head(10)
top_10_ratings
# ->
mean_ratings = data.pivot_table(values='rating', index='title', aggfunc='mean')
top_20_mean_ratings = mean_ratings.sort_values(ascending=False).head(20)
top_20_mean_ratings
# -> ,
mean_ratings[top_10_ratings.index]
# -> , ,
ratings_by_movie_title[top_20_mean_ratings.index]
# -> 1000
top_10_movies = mean_ratings[top_ratings.index].sort_values(ascending=False).head(10)
top_10_movies
#
df_top_10_movies = pd.DataFrame(top_10_movies)
df_top_10_movies['hot'] = top_ratings[top_10_movies.index]
df_top_10_movies
コアデータ構造
import pandas as pd
import numpy as np
Series
Seriesは1次元ラベル付き配列で,配列に任意のデータ(整数,浮動小数点数,文字列,Python Object)を入れることができる.基本的な作成関数は次のとおりです.
s=pd.Series(data,index=index)では、indexはデータのラベルとして使用されるリストです.dataは、異なるデータ型であってもよい.
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
s.index
s = pd.Series(np.random.randn(5))
s
s.index
辞書から作成
#
d = {'a' : 0., 'b' : 1., 'd' : 3}
s = pd.Series(d, index=list('abcd'))
s
スカラーから作成
pd.Series(3, index=list('abcde'))
print "Missing required dependencies {values}".format(values = ['aaa', 'bbb'])
Seriesはクラスndarrayオブジェクトです
s = pd.Series(np.random.randn(5))
s
s[:3]
np.exp(s)
np.sin(s)
Seriesはクラス辞書オブジェクトです
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
s['a']
s['e'] = 5
s['g'] = 100
print s.get('f', np.nan)
ラベルの整列
s1 = pd.Series(np.random.randn(3), index=['a', 'c', 'e'])
s2 = pd.Series(np.random.randn(3), index=['a', 'd', 'e'])
print '{0}
{1}'.format(s1, s2)
s1 + s2
nameプロパティ
s = pd.Series(np.random.randn(5), name='Some Thing')
s
s.name
DataFrame
DataFrameは、2 D行ラベルと列ラベルの配列です.DataFrameをExcelテーブルやSQLデータベースのテーブルにしたり、Seriesオブジェクト辞書にしたりすることができます.Pandasで最もよく使われるデータ構造です.
DataFrameを作成する基本形式は次のとおりです.
df=pd.DataFrame(data,index=index,columns=columns)indexは行ラベル、columnsは列ラベル、dataは次のデータです.
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
pd.DataFrame(d)
pd.DataFrame(d, index=['d', 'b', 'a'])
pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
d = {'one' : [1, 2, 3, 4],
'two' : [21, 22, 23, 24]})
pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
構造化データから作成
data = [(1, 2.2, 'Hello'), (2, 3., "World")]
pd.DataFrame(data)
pd.DataFrame(data, index=['first', 'second'], columns=['A', 'B', 'C'])
辞書リストから作成
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
pd.DataFrame(data)
pd.DataFrame(data, index=['first', 'second'])
pd.DataFrame(data, columns=['a', 'b'])
タプル辞書から作成
d = {('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}
#
pd.DataFrame(d)
Seriesから作成
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
pd.DataFrame(s)
pd.DataFrame(s, index=['a', 'c', 'd'])
pd.DataFrame(s, index=['a', 'c', 'd'], columns=['A'])
列の選択/追加/削除
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'])
df
df['one']
df['three'] = df['one'] + df['two']
df
df['flag'] = df['one'] > 0
df
del df['three']
df
four = df.pop('four')
four
df['five'] = 5
df
#
df.insert(1, 'bar', df['one'])
df
assign()メソッドを使用して新しいカラムを挿入
df = pd.DataFrame(np.random.randint(1, 5, (6, 4)), columns=list('ABCD'))
df
df.assign(Ratio = df['A'] / df['B'])
df.assign(AB_Ratio = lambda x: x.A / x.B, CD_Ratio = lambda x: x.C - x.D)
df.assign(AB_Ratio = lambda x: x.A / x.B).assign(ABD_Ratio = lambda x: x.AB_Ratio * x.D)
索引と選択
対応するアクション、構文、および結果の戻し
列を選択->df[col]->Series行ラベルから行を選択->df.loc[label]->Series行位置から行を選択->df.iloc[label]->Series行を選択->df[5:10]->DataFrameブールベクトルから複数行を選択->df[bool_vector]->DataFrame
df = pd.DataFrame(np.random.randint(1, 10, (6, 4)), index=list('abcdef'), columns=list('ABCD'))
df
df['A']
df.loc['a']
df.iloc[0]
df[1:4]
df[[False, True, True, False, True, False]]
データの配置
df1 = pd.DataFrame(np.random.randn(10, 4), index=list('abcdefghij'), columns=['A', 'B', 'C', 'D'])
df1
df2 = pd.DataFrame(np.random.randn(7, 3), index=list('cdefghi'), columns=['A', 'B', 'C'])
df2
df1 + df2
df1 - df1.iloc[0]
numpy関数の使用
df = pd.DataFrame(np.random.randn(10, 4), columns=['one', 'two', 'three', 'four'])
df
np.exp(df)
np.asarray(df) == df.values
type(np.asarray(df))
np.asarray(df) == df
# TAB
df.one
Panel
Panelは3 Dラベル付き配列です.実際,Pandasの名称の由来はPanelによって進化したもの,すなわちpan(el)−da(ta)−sである.Panelは比較的少ないが、依然として最も重要な基礎データ構造の一つである.
items:座標軸0、インデックス対応要素はDataFrame major_axis:座標軸1,DataFrameの行ラベルminor_axis:座標軸2,DataFrameの列ラベル
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
pn = pd.Panel(data)
pn
pn['Item1']
pn.items
#
pn.major_xs(pn.major_axis[0])
#
pn.minor_xs(pn.major_axis[1])
pn.to_frame()