pandas学習-分類データ

14545 ワード

学習リンク:第8章分類データ.
八、分類データ
  • 8.1 categoryの作成とその性質
  • 8.2分類変数のカテゴリ
  • 8.3分類変数のソート
  • 8.4分類変数の比較操作
  • 問題と練習
  • 8.1 categoryの作成とその性質
  • 分類変数の作成(a)Series作成
    pd.Series(["a", "b", "c", "a"], dtype="category")
    
    (b)DataFrame指定タイプ作成
    temp_df = pd.DataFrame({'A':pd.Series(["a", "b", "c", "a"], dtype="category"),'B':list('abcd')})
    
    (c)内蔵Categoricalタイプ作成
      :
    cat = pd.Categorical(["a", "b", "c", "a"], categories=['a','b','c'])
    pd.Series(cat)
      :
    0    a
    1    b
    2    c
    3    a
    dtype: category
    Categories (3, object): [a, b, c]
    
    (d)pd.cut()関数を使用して
      :pd.cut(pd.Series([1,35,56]), [0,10,30,60], right=False, labels=['0-10','10-30','30-60'])
      :
    0     0-10
    1    30-60
    2    30-60
    dtype: category
    Categories (3, object): [0-10 < 10-30 < 30-60]
    
    最初のパラメータを作成する
      :s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
    s.describe()
      :
    count     4
    unique    3
    top       a
    freq      2
    dtype: object
    
    最初のパラメータ:分割する数値2番目のパラメータ:分割する区間rightパラメータ:Tureの場合、左に開いて右に閉じる;Falseの場合、左閉右開labelsパラメータ:区間ラベルを指定[注]:cut関数を使用して作成された分類変数は、デフォルトでは秩序分類変数
  • です.
  • 分類変数の構造分類変数は、要素値(values)、分類カテゴリ(categories)、秩序化(order)(a)describe()の3つの部分を含み、この方法が非欠落値個数、要素値カテゴリ数(分類カテゴリ数ではない)、最も頻繁に発生する要素およびその頻度
      :s.cat.categories
      :Index(['a', 'b', 'c', 'd'], dtype='object')
    
    (b)cat.categories分類
    In:s.cat.ordered
    Out:False
    
    (c)cat.ordered
      :
    s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
    s.cat.set_categories(['new_a','c'])
      :
    0    NaN
    1    NaN
    2      c
    3    NaN
    4    NaN
    dtype: category
    Categories (2, object): [new_a, c]
    
    (b)cat.cat.cat.cordered
  • 8.2分類変数のカテゴリ
  • cat.set_categories()分類は変更されますが、その値は変更されません
      :
    s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))		#    
    s.cat.rename_categories(['new_%s'%i for i in s.cat.categories])
      :
    0    new_a
    1    new_b
    2    new_c
    3    new_a
    4      NaN
    dtype: category
    Categories (4, object): [new_a, new_b, new_c, new_d]
    
      :s.cat.rename_categories({'a':'new_a','b':'new_b'})		      
      :
    0    new_a
    1    new_b
    2        c
    3    new_a
    4      NaN
    dtype: category
    Categories (4, object): [new_a, new_b, c, d]
    
  • cat.rename_categories()このメソッドでは、値と分類を同時に
    s.cat.add_categories(['e'])
    
  • に変更します.
  • cat.add_categories()追加カテゴリ
    s.cat.remove_categories(['d'])
    
  • cat.remove_categories()削除カテゴリ
      :
    s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
    s.cat.remove_unused_categories()
      :
    0      a
    1      b
    2      c
    3      a
    4    NaN
    dtype: category
    Categories (3, object): [a, b, c]
    
  • cat.remove_unused_categories()要素値が表示されない分類タイプ
      :
    s1 = pd.Series(pd.Categorical(["a", "b", "c", "a", np.nan], categories=['a', 'b', 'c', 'd', 'e']) )
    s2 = pd.Series(pd.Categorical(["a", "b", "c", "d", "e"], categories=['a', 'b', 'c', 'd', 'r']))
    from pandas.api.types import union_categoricals 
    union_categoricals([s1, s2])
      :
    [a, b, c, a, NaN, a, b, c, d, NaN]
    Categories (6, object): [a, b, c, d, e, r]
    
      :pd.concat([s1, s2])
      :
    0      a
    1      b
    2      c
    3      a
    4    NaN
    0      a
    1      b
    2      c
    3      d
    4    NaN
    dtype: object		#  concat()          object
    
  • を削除
  • union_categoricals()は分類をマージし、値と分類を同時に
    s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered()		#  
    s.cat.as_unordered()		#  
    
  • にマージします.
    8.3分類変数の並べ替え
  • シーケンスの確立(a)cat.as_ordered()は、シーケンスを秩序変数に変換する.cat.as_unordered()シーケンスを無秩序変数に変換する
    pd.Series(["a", "d", "c", "a"]).astype('category').cat.set_categories(['a','c','d'],ordered=True)
    
    (b)set_categoriesメソッドのorderパラメータ
      :
    s = pd.Series(["a", "d", "c", "a"]).astype('category')
    s.cat.reorder_categories(['a','d','c'],ordered=True)
      :
    0    a
    1    d
    2    c
    3    a
    dtype: category
    Categories (3, object): [a < d < c]
    
    (c)cat.reorder_categories()新しく設定された分類は、元の分類と同じセットに分類する必要があります.
  • ソート1章で説明する値ソートとインデックスソートは、いずれも適用可能な
    #   
    s = pd.Series(np.random.choice(['perfect','good','fair','bad','awful'],50)).astype('category')
    s.cat.set_categories(['perfect','good','fair','bad','awful'][::-1],ordered=True).head()
    s.sort_values(ascending=False).head()		#False  ,True  
    #    
    df_sort = pd.DataFrame({'cat':s.values,'value':np.random.randn(50)}).set_index('cat')
    df_sort.head()
    df_sort.sort_index().head()
    
  • です.
    8.4分類変数の比較操作
  • スカラーまたは等長シーケンスとの比較(a)スカラー比較
      :
    s = pd.Series(["a", "d", "c", "a"]).astype('category')
    s == 'a'
      :
    0     True
    1    False
    2    False
    3     True
    dtype: bool
    
    (b)等長シーケンス比較
      :s == list('abcd')
      :
    0     True
    1    False
    2     True
    3    False
    dtype: bool
    
  • 別の分類変数との比較(a)等式判別(等号と不等号を含む)2つの分類変数の等式判別は分類が全く同じ(b)不等式判別(>=,<=,)2つの分類変数の不等式判別を満たすには2つの条件を満たす必要がある:①分類が完全に同じ②並べ替えが完全に同じ
    s = pd.Series(["a", "d", "c", "a"]).astype('category')
    #s >= s #  
      :
    s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.reorder_categories(['a','c','d'],ordered=True)
    s >= s
      :
    0    True
    1    True
    2    True
    3    True
    dtype: bool
    
  • 問題と練習
    #1(a)
    df = pd.read_csv(r"D:\python\python3.6\pysl\Pre_\data\Earthquake.csv")
    s = pd.cut(df["  "], [-1e-10,5,10,15,20,30,50,np.inf], labels=['Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ'])
    df['  '] = s
    df.sort_values(by='  ', ascending=True)
    #1(b)
    df['  '] = pd.cut(df['  '], [-1e-10,3,4,5,np.inf])
    df.set_index(['  ', '  ']).sort_index()
    #2
    def my_crosstab(foo,bar):
        num = len(foo)
        s1 = pd.Series([i for i in list(foo.categories.union(set(foo)))],name='1nd var')
        s2 = [i for i in list(bar.categories.union(set(bar)))]
        df = pd.DataFrame({i:[0]*len(s1) for i in s2},index=s1)
        for i in range(num):
            df.at[foo[i],bar[i]] += 1
        return df.rename_axis('2st var',axis=1)
    my_crosstab(foo,bar)