Pandsデータ操作まとめ

13201 ワード

PandsはNumPyの上に設立され、多くの他の第三者ライブラリと科学計算環境に完璧に集積することを目的としています.その二つの主要データ構造はSeries(1次元)とDataFrame(2次元)である.
一、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/O
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)

#      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))
詳細