Pandsデータ操作まとめ
13201 ワード
PandsはNumPyの上に設立され、多くの他の第三者ライブラリと科学計算環境に完璧に集積することを目的としています.その二つの主要データ構造はSeries(1次元)とDataFrame(2次元)である.
一、Pandsデータ構造:一次元配列(Series)
1、Series配列を作成する
Seriesは1次元のデータタイプで、各要素にはラベルがあります.Numpyの要素ラベル付き配列と同様です.ここで、ラベルは数字または文字列とすることができます.
Seriesオブジェクトは、いくつかの異なるインデックス方法を提供します.
(1)列挙索引
列挙索引はindex値に従って索引を行います.index値はデフォルトでは下付きを使用します.下付きは常に0から始まります.インデックス値は常に数字です.キーワードでindexに値を割り当てることもできます.キーワードは数字でもいいし、文字列でもいいです.
スライスインデックスは下付き文字を使用しています.indexの影響を受けません.
PandsはDataframeという二次元テーブル構造を提供する.DataFrameは、行名(index)と列名(columns)とデータ(values)からなる表計算ドキュメントとして想像できます.
1、Dataframeデータテーブルを作成する
(1)辞書から作成する
二次元配列から直接DataFrameを作成し、同じ形状の結果データを得て、indexとcolumnsが指定されていない場合、両者は標準の数字フォーマットに戻ります.
(1)列挙索引
四、SeriesとDataFrameの基本操作
1、SeriesとDataFrameに削除要素を追加します.
(1)Series削除要素を追加
(1)データ置換
map()関数は一つのデータから一つのデータへのマッピング関係です.中にはデータの添削がありません.map(function、list)はリストの中のデータを取り出してからfunctionに使います.
(1)numpyを使用して転置を実現する
stack()はデータの列を「回転」します.新しい行のインデックスは元の行のインデックスより1つ低いレベル(0のレベルが一番高い)です.unstack()はデータの行を「回転」した列で、デフォルトで回転するのはレベルが一番低いインデックスです.
(1)スタック
concat()は軸方向データセットのスタックを実現できます.
merge()は、SQLデータベースのjoinと同様に、1つまたは複数のキーに従って異なるDataFrameを接続してもよい.
一、Pandsデータ構造:一次元配列(Series)
1、Series配列を作成する
Seriesは1次元のデータタイプで、各要素にはラベルがあります.Numpyの要素ラベル付き配列と同様です.ここで、ラベルは数字または文字列とすることができます.
import numpy as np
import pandas as pd
#
a = pd.Series([1, 2, 5, 6, 8])
print(a)
#
b = pd.Series(5, index = [0,1,2,3])
print(b)
# numpy
data1 = np.array(['a','b', 3, 4])
c = pd.Series(data1, index = ['a','b','c','d'])
print(c)
#
data2 = {'a':1, 'b':2, 'c':3}
d = pd.Series(data2, index = ['a','b','c','d'])
print(d)
2、Series配列の索引Seriesオブジェクトは、いくつかの異なるインデックス方法を提供します.
(1)列挙索引
列挙索引はindex値に従って索引を行います.index値はデフォルトでは下付きを使用します.下付きは常に0から始まります.インデックス値は常に数字です.キーワードでindexに値を割り当てることもできます.キーワードは数字でもいいし、文字列でもいいです.
import numpy as np
import pandas as pd
# index( )
a = pd.Series([1, 2, 5, 6, 8])
print(a.index)
print(a.values) # [1 2 5 6 8]
print(a[4]) # 8
print(a[[1,3]].values) # [2, 6]
# index
b = pd.Series([1, 2, 5, 6, 8], index = [1, 2, 'k', 'j', 'k'])
print(b.index)
print(b.values) # [1 2 5 6 8]
print(b[4]) #
print(b[[2,'j']].values) # [2, 6]
print(b[[2,'k']].values) # [2 5 8]
(2)ブール索引import numpy as np
import pandas as pd
#
a = pd.Series([1, 2, 5, 6, 8], index=['a', 'b', 'c', 'd', 'd'])
print(a.index)
print(a.values) # [1 2 5 6 8]
print(a>3) # False False True True True
print(a[a>3].values) # [5 6 8]
(3)スライスインデックススライスインデックスは下付き文字を使用しています.indexの影響を受けません.
import numpy as np
import pandas as pd
a = pd.Series([1, 2, 5, 6, 8])
print(a[1:3].values) # [2 5]
b = pd.Series([1, 2, 5, 6, 8], index = [1, 2, 3, 4, 5])
print(b[1:3].values) # [2 5]
二、Pandsデータ構造:データテーブル(Dataframe)PandsはDataframeという二次元テーブル構造を提供する.DataFrameは、行名(index)と列名(columns)とデータ(values)からなる表計算ドキュメントとして想像できます.
1、Dataframeデータテーブルを作成する
(1)辞書から作成する
import numpy as np
import pandas as pd
data = {
"a":[1,2,3],
"b":[4,5,6],
"c":[7,8,9]
}
# (index)
df1 = pd.DataFrame(data)
print(df1)
# (index)
df2 = pd.DataFrame(data, index=['A','B','C'])
print(df2)
(2)Seriesから作成import numpy as np
import pandas as pd
data = {"a":pd.Series([1,2,3],['A','B','C']),
"b":pd.Series([4,5,6],['A','B','C']),
"c":pd.Series([7,8,9],['A','B','C'])}
df = pd.DataFrame(data)
print(df)
(3)二次元配列から直接作成する二次元配列から直接DataFrameを作成し、同じ形状の結果データを得て、indexとcolumnsが指定されていない場合、両者は標準の数字フォーマットに戻ります.
import numpy as np
import pandas as pd
data = np.random.rand(9).reshape(3,3)
df = pd.DataFrame(data, index = ['a', 'b', 'c'], columns = ['one','two','three'])
print(df)
2、Dataframeデータテーブルの索引(1)列挙索引
import numpy as np
import pandas as pd
data = {
"a":[1,2,3],
"b":[4,5,6],
"c":[7,8,9]
}
df = pd.DataFrame(data, index=['x','y','z'])
print(df)
#
print(df['a'][0])
print(df['a']['x'])
#
print(df.T['x'][0])
print(df.T['x']['b'])
#
print(df['a'][['x','y','z']].values)
print(df['a'][[0,1,2]].values)
(2)ブール索引import numpy as np
import pandas as pd
data = {
"a":[1,2,3],
"b":[4,5,6],
"c":[7,8,9]
}
df = pd.DataFrame(data, index=['x','y','z'])
print(df)
#
print(df['b']>3)
print(df['b'][df['b']>3])
print(df['b'][df['b']>3].values)
#
print(df>3)
print(df[df>3])
print(df[df>3].values)
(3)スライスインデックスimport numpy as np
import pandas as pd
data = {
"a":[1,2,3],
"b":[4,5,6],
"c":[7,8,9]
}
df = pd.DataFrame(data, index=['x','y','z'])
print(df)
#
print(df['b'][0:2])
#
print(df[0:1][0:2])
(4)locとilocインデックスimport numpy as np
import pandas as pd
data = {
"a":[1,2,3],
"b":[4,5,6],
"c":[7,8,9]
}
df1 = pd.DataFrame(data)
df2 = pd.DataFrame(data, index=['x','y','z'])
# loc
print(df1.loc[1, 'a'])
print(df1.loc[[0,1,2], 'a'])
print(df1.loc[0:2, 'a'])
print(df2.loc['y', 'a'])
print(df2.loc[['x','y','z'], 'a'])
# iloc
print(df1.iloc[1, 0])
print(df1.iloc[[0,1,2], 0])
print(df1.iloc[0:3, 0])
print(df2.iloc[1, 0])
print(df2.iloc[[0,1,2], 0])
3、マルチインデックスDataframeデータテーブル#
midx = pd.MultiIndex(levels=[['Tom', 'Bob', 'Jam'], ['income', 'weight', 'length']],
codes=[[0, 0, 0, 1, 1, 1, 2, 2, 2],[0, 1, 2, 0, 1, 2, 0, 1, 2]])
df = pd.DataFrame(index=midx,
columns=['max', 'min'],
data=[[200, 100],[55, 50], [1.5, 1.4], # Tom , ,
[400, 300],[65, 60], [1.6, 1.5], # Bob , ,
[600, 500],[75, 70], [1.8, 1.7]]) # Jam , ,
print(df)
三、PandsデータI/Oimport numpy as np
import pandas as pd
data = {
"a":[1,2,3],
"b":[4,5,6],
"c":[7,8,9]
}
df = pd.DataFrame(data)
# csv
df.to_csv('01.csv', index=False, encoding='utf-8')
df1 = pd.read_csv('01.csv')
print(df1)
# execl , xlrd openpyxl
df.to_excel('02.xlsx', index=False, encoding='utf-8')
df2 = pd.read_excel('02.xlsx')
print(df2)
# txt
df.to_csv('03.txt', sep='@', index=False, encoding='utf-8')
df3 = pd.read_csv('03.txt', sep='@')
print(df3)
# pickling
df.to_pickle('04.pkl')
df4 = pd.read_pickle('04.pkl')
print(df4)
もっと知りたい四、SeriesとDataFrameの基本操作
1、SeriesとDataFrameに削除要素を追加します.
(1)Series削除要素を追加
import numpy as np
import pandas as pd
s1 = pd.Series([-1, -2, -3], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3, 4], index=['e', 'f', 'c', 'd'])
#
s1['d'] = -4
s3 = s1.append(pd.Series([-4], index=['a'])) # verify_integrity=True
print(s3)
s4 = s1.append(s2)
print(s4)
#
s1.drop('d', inplace=False) # True Series
print(s1)
s1.pop('d')
print(s1)
(1)DataFrameに削除要素を追加するimport numpy as np
import pandas as pd
df = pd.DataFrame({'one' : pd.Series([-1, -2, -3]),
'two' : pd.Series([1, 2, 3, 4])})
#
df['three'] = pd.Series([10,20,30])
df['four'] = df['one']+df['three']
df.loc[:, "five"] = [1, 4, 5, 9]
print(df)
#
temp_df = pd.DataFrame([[5, 6], [7, 8]], columns=['one','two'])
df = df.append(temp_df, sort=False, ignore_index=True) # ignore_index=True
print(df)
df.loc[df.shape[0]] = [0, 0, 0, 0, 0]
print(df)
#
df.drop(3, axis=0, inplace=True)
print(df)
#
df.drop(['four','five'], axis=1, inplace=True)
print(df)
2、SeriesとDataFrameのデータ列の重さimport numpy as np
import pandas as pd
s = pd.Series([-1, -1, -2, -2, -3])
df = pd.DataFrame({'k1':['one','two']*3+['two'],
'k2':[1,1,1,2,1,3,3]})
#
print(s.duplicated())
print(df.duplicated())
#
print(s.drop_duplicates())
print(df.drop_duplicates())
#
print(df.drop_duplicates(['k1']))
3、SeriesとDataFrameデータの置換とマッピング(1)データ置換
import numpy as np
import pandas as pd
s = pd.Series([-1, -1, -2, -2, -3])
df = pd.DataFrame({'k1':['one','two']*3+['two'],
'k2':[1,1,1,2,1,3,3]})
# Series
print(s.replace(-3, 999))
print(s.replace([-1,-2], 3))
print(s.replace({-1:'a',-2:'b'}))
# DataFrame
print(df.replace(1, 999))
print(df.replace([1,2], 3))
print(df.replace({1:'a',2:'b'}))
(2)データマップmap()関数は一つのデータから一つのデータへのマッピング関係です.中にはデータの添削がありません.map(function、list)はリストの中のデータを取り出してからfunctionに使います.
import numpy as np
import pandas as pd
df = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',
'Pastrami', 'corned beef', 'Bacon',
'pastrami', 'honey ham', 'nova lox'],
'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
meat_to_animal = {
'bacon': 'pig',
'pulled pork': 'pig',
'pastrami': 'cow',
'corned beef': 'cow',
'honey ham': 'pig',
'nova lox': 'salmon'
}
###################### ########################
# lower()
lowercased = df['food'].str.lower()
print(lowercased)
#
print(lowercased.map(meat_to_animal))
df['animal1']=lowercased.map(meat_to_animal)
print(df)
###################### ########################
# df['animal2']=df['food'].map(lambda x : meat_to_animal[x.lower()])
transform = lambda x : meat_to_animal[x.lower()]
df['animal2']=df['food'].map(transform)
print(df)
4、DataFrame行列変換(1)numpyを使用して転置を実現する
import numpy as np
import pandas as pd
df = pd.DataFrame([[0, 1, 2],
[3, 4, 5]], columns=['c1', 'c2', 'c3'])
print(df)
df2 = pd.DataFrame(df.values.T, index=df.columns, columns=df.index)
print(df2)
(2)パンダス多級索引を利用して転置を実現するstack()はデータの列を「回転」します.新しい行のインデックスは元の行のインデックスより1つ低いレベル(0のレベルが一番高い)です.unstack()はデータの行を「回転」した列で、デフォルトで回転するのはレベルが一番低いインデックスです.
import numpy as np
import pandas as pd
df = pd.DataFrame([[0, 1, 2],
[3, 4, 5]], columns=['c1', 'c2', 'c3'])
print(df)
#
df = df.stack()
print(df)
#
df = df.unstack(0)
print(df)
#
print(df.stack().unstack(0))
5、DataFrameを結合し、分割する(1)スタック
concat()は軸方向データセットのスタックを実現できます.
import numpy as np
import pandas as pd
s1 = pd.Series([0, 1])
s2 = pd.Series([2, 3, 4])
s3 = pd.Series([5, 6])
#
df1 = pd.concat([s1, s2, s3], ignore_index=True) # axis=0
print(df1)
df2 = pd.concat([s1, s2, s3])
df2.set_axis(range(len(df2)), inplace=True)
print(df2)
#
df3 = pd.concat([s1, s2, s3], axis=1)
print(df3)
(2)接続merge()は、SQLデータベースのjoinと同様に、1つまたは複数のキーに従って異なるDataFrameを接続してもよい.
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'userid': [1,2,3,4], 'level': list('ssab')})
df2 = pd.DataFrame({'userid': [1,3,5], 'age': [16, 22, 34]})
print(pd.merge(df1, df2)) # (how='inner')
print(pd.merge(df1, df2, how='outer')) #
print(pd.merge(df1, df2, how='left')) #
print(pd.merge(df1, df2, how='right')) #
print(pd.merge(df1, df2, on=['userid'])) #
(3)分割import numpy as np
import pandas as pd
df = pd.DataFrame([['Computer', 'Mac-Dell'],
['Computer', 'Mac-XiaoMi'],
['Computer', 'Mac-HuaWei-9X']], columns=['Type', 'Brands_rank'])
print(df)
#
df['Brands-Second'] = df.Brands_rank.apply(lambda x: x.split('-')[1])
df['Brands-Third'] = df.Brands_rank.apply(lambda x: x.split('-')[2] if x.count('-') >= 2 else np.nan)
print(df)
#
df2 = df
df2 = df.Brands_rank.str.split('-', expand=True).stack().to_frame()
df2 = df2.reset_index(level=1, drop=True).rename(columns={0:'Brands'})
print(df[['Type']].join(df2))
6、Data Frame並べ替えimport numpy as np
import pandas as pd
df = pd.DataFrame([[0, 1, 2],
[3, 4, 5]], columns=['c1', 'c2', 'c3'])
############ #############
#
print(df.sort_index())
#
print(df.sort_index(ascending=False))
############ #############
#
print(df.sort_index(axis=1))
#
print(df.sort_index(axis=1, ascending=False))
############ #################
#
print(df.sort_values(by='c2'))
#
print(df.sort_values(by='c2', ascending=False))
#
print(df.sort_values(by=['c2', 'c3'], ascending=False))
詳細