DataFrame(14):MySQLと比較して「Pandasのグループ集約」(超詳細)を学ぶ

56832 ワード

ここで説明する「データセット」リンクのダウンロードアドレスは、次のとおりです.http://note.youdao.com/noteshare?id=5f44492149116cb6c52233786c1ca98d&sub=6C35AFC6AF9441648F245393DCAC61CB
1、MySQLとPandasのグループ化の比較説明
1)いずれも表データの処理に用いる
  mysqlでもpandasでもexcelのような2次元テーブルデータを処理します.2 Dテーブルの場合、各ローはレコードとみなされ、各カラムはフィールドとみなされます.
2)グループ化のスタイルが違う
mysqlを学んだことがある人はみな知っています.mysqlはデータ処理と統計分析をするとき、文法の順序と実行の順序が一致していないので、多くの初心者がsql文を書き間違えやすいという大きな痛みがあります.業界ではexcelのような2 Dテーブルデータを処理しています.通常、次の2つのスタイルがあります.
  • DSLスタイル:オブジェクト向けに操作され、pandasはこのような方式を採用しており、一般的には「文法順序と実行順序が一致している」と言われています.
  • SQLスタイル:sql文を書いて処理します.

  • 3)コードの観点から両者の違いを説明する
    ① mysql
    構文の順序:
    SELECT Column1, Column2, mean(Column3), sum(Column4)  
    FROM SomeTable  
    WHERE Condition 1  
    GROUP BY Column1, Column2  
    HAVING Condition2 
    

    論理実行順序:
    from...where...group...select...having...limit
    

    ② pandas
    構文順序と論理実行順序:
    df[Condition1].groupby([Column1,Column2],as_index=False).agg({Column3: "mean",Column4:"sum"})
    

    ③図示説明
    DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第1张图片
  • まずfromはMySQLのテーブルを取り出すことに相当し,pandasと比較してdfテーブルオブジェクトを得た.
  • は、whereフィルタリングを実行し、pandasと比較するとcondition 1フィルタリング条件を書き、パケットを作成する前のフィルタリングに相当します.
  • は次にgroupパケット条件を実行し、pandasと比較してgroupby条件を書いてパケットを行う.
  • に続いてselect条件が実行され、集約関数はselectの後に書かれ、pandasと比較してagg()関数が実行され、count、max、min、sum、mean集約関数が異なる列に対して実行される.
  • が最後に実行したのはhavingがパケットを表すフィルタであり、pandasでは、上図からdf 1オブジェクトが得られたことがわかり、このdf 1オブジェクトに対して、もう一度フィルタを行い、パケット後のフィルタも示す.
  • 以上をまとめると、あなたの論理がよく考えられさえすれば、pandasでは、文法の順序と論理の実行の順序が一致しているので、論理の順序で書くのは簡単です.

  • 4)MySQLとPandasのグループ化の一例
    1異なるdeptno(部門)の下で、sal(給料)が8000より大きい部門、給料を求めます;
    DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第2张图片
    ②mysqiでのコード実行は以下の通りです.
    select deptno,sum(sal) sums
    from emp
    group by deptno
    having sums > 9000;
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第3张图片
    ③pandasでのコード実行は次のとおりです.
    df = pd.read_excel(r"C:\Users\  \Desktop\emp.xlsx")
    display(df)
    
    df = df.groupby("deptno",as_index=False).agg({"sal":"sum"})
    display(df)
    
    df1 = df[df["sal"]>9000]
    display(df1)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第4张图片
    2、groupbyグループ重合の原理説明
    1)原理図
    DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第5张图片
    2)原理説明
  • split:指定されたルールに従ってグループ化され、groupbyによって実現される.
  • apply:各グループに対して、関数を使用して操作し、結果を得、agg()関数によって実現する.
  • combine:各グループで得られた結果をまとめ、最終結果を得る.
  • 注意:combineのステップは自動的に完了するので、pandasのパケット集約に対して、私たちは2つの内容を学ぶだけで、1どのようにパケットをグループ化するかを学ぶ必要があります.②各パケットのデータに対して、対応する論理操作を行う方法を学習する.

  • 3、groupbyグループオブジェクトの関連操作
      グループ化はgroupbyメソッドによってSeriesまたはDataFrameオブジェクトに対してグループ化操作を実現することができ、このメソッドはグループ化オブジェクトを返す.ただし、オブジェクトを直接表示(出力)すると、パケット情報は表示されません.
    1)groupby()関数構文
    ①文法は以下の通り
  • groupby(by=["フィールド1","フィールド2",...],as_index=True)
  • ②パラメータ説明
  • byパラメータが入力したパケットフィールドは、1つのフィールドしかない場合、by=「フィールド1」と直接書くことができる.マルチフィールドがグループ化されると、リスト形式by=["フィールド1","フィールド2"]と書く.
  • as_indexパラメータの使用図DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第6张图片
  • ③パラメータas_indexの使用説明
    x = {"name":["a","a","b","b","c","c","c"],"num":[2,4,0,5,5,10,15]}
    df = pd.DataFrame(x)
    display(df)
    
    df.groupby("name",as_index=True).agg({"num":"sum"})
    df.groupby("name",as_index=False).agg({"num":"sum"})
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第7张图片
    2)groupbyグループ化オブジェクトの一般的な方法または属性.
    1 groupsプロパティ:辞書を返します.keyはグループ名を表し、valueはこのグループのすべてのレコードを表します.
    ②size()メソッド:各パケットのレコード数を返します.
    x = {"name":["a","a","b","b","c","c","c"],"num":[2,4,0,5,5,10,15]}
    df = pd.DataFrame(x)
    display(df)
    
    df.groupby("deptno").groups
    df.groupby("deptno").size()
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第8张图片
    3)forループを使用してgroupby()グループオブジェクトの各グループの具体的なデータを印刷する
    x = {"name":["a","a","b","b","c","c","c"],"num":[2,4,0,5,5,10,15]}
    df = pd.DataFrame(x)
    display(df)
    
    groupdf = df.groupby("name")
    for (x,y) in groupdf:
        display(x, y)
    

    結果は以下の通りである:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第9张图片)groupby()パケットパラメータの4つの形式
  • 単一フィールドパケット:dfのあるフィールドに基づいてパケット化される.
  • マルチフィールドパケット:df内の複数のフィールドに基づいてコンビネーションパケットを行う.
  • 辞書またはSeries:keyはインデックスを指定し、valueはグループ化の根拠、すなわちvalue値が等しいレコードを指定し、グループに分けられます.
  • カスタム関数:インデックスを受け入れ、インデックスが同じレコードをグループ化します.

  • 次のデータを使用して、4つのグループ化パラメータを実証します.
    df = pd.DataFrame({"  ":["A", "A", "B", "B"],
                       "  ":["g1", "g2", "g1", "g2"], 
                       "  ":[10, 20, 15, 28], 
                       "  ":["a", "b", "c", "d"], 
                       "  ":[20, 15, 18, 30]})
    display(df)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第10张图片
    ①単一フィールドグループ化:dfのいずれかのフィールドに従ってグループ化する.
    g = df.groupby("  ")
    display(g)
    
    for (x,y) in g:
        display(x, y)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第11张图片
    ②マルチフィールドパケット:df内の複数のフィールドに従ってコンビネーションパケットを行う.
    g = df.groupby(["  ","  "])
    display(g)
    
    for (x,y) in g:
        display(x, y)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第12张图片
    ③辞書:keyはインデックスを指定し、valueはパケット根拠、すなわちvalue値が等しいレコードを指定し、グループに分けます.
    g = df.groupby({0:1, 1:1, 2:1, 3:2})
    display(g)
    
    for (x,y) in g:
        display(x, y)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第13张图片
    ④Series:グループソート(重要)
    df = pd.DataFrame({"  ":["A", "A", "A", "B", "B", "B"],
                       "  ":[10, 32, 20, 15, 28, 10], 
                       "   ":[20, 15, 33, 18, 30, 22]})
    display(df)
    
    df["  "] = df["   "].groupby(df["  "]).rank()
    df
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第14张图片
    ⑤カスタム関数:部門A、Bを一組に分け、Cを一組にする(特別な需要)
    df = pd.DataFrame({"  ":["A", "A", "B", "B", "C", "C"],
                       "  ":["g1", "g2", "g1", "g2", "g1", "g2"], 
                       "  ":[10, 20, 15, 28, 12, 14], 
                       "  ":["a", "b", "c", "d", "e", "f"], 
                       "  ":[20, 15, 18, 30, 23, 34]})
    df = df.set_index("  ")
    display(df)
    
    def func(x):
        if x=="A" or x=="B":
            return 0
        else:
            return 1
    
    g = df.groupby(func)
    display(g)
    
    for (x,y) in g:
        display(x, y)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第15张图片
    4、agg()重合操作に関する説明
      groupby()パケットを使用すると、パケットオブジェクトが得られます.groupby()パケットが使用されていない場合、テーブル全体は1つのグループと見なすことができ、1つのパケットオブジェクトにも相当する.  パケットオブジェクトに対して、集約関数sum()、mean()、count()、max()、min()を直接呼び出すこともできます.また、agg()に指定されたパラメータが入力されるように、パケットオブジェクトのagg()メソッドを呼び出すこともできます.
    1)グループ化されたオブジェクトに対して直接集約関数を呼び出す
    ①dfテーブル全体に対して、集約関数を直接呼び出す
    df = pd.DataFrame({"  ":["A", "A", "B", "B", "C", "C"],
                       "  ":["g1", "g2", "g1", "g2", "g1", "g2"], 
                       "  ":[10, 20, 15, 28, 12, 14], 
                       "  ":["a", "b", "c", "d", "e", "f"], 
                       "  ":[20, 15, 18, 30, 23, 34]})
    display(df)
    
    df["  "].mean()
    df[["  ","  "]].mean()
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第16张图片
    ②dfパケット後のオブジェクトに対して、集約関数を直接呼び出す
    df = pd.DataFrame({"  ":["A", "A", "B", "B", "C", "C"],
                       "  ":["g1", "g2", "g1", "g2", "g1", "g2"], 
                       "  ":[10, 20, 15, 28, 12, 14], 
                       "  ":["a", "b", "c", "d", "e", "f"], 
                       "  ":[20, 15, 18, 30, 23, 34]})
    display(df)
    
    df.groupby("  ")["  "].mean()
    df.groupby("  ").mean()
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第17张图片
    2)グループ化オブジェクトに対してagg()関数を直接呼び出す(重要)
    以下の知識の説明では、「集約関数文字列」について説明します.これは私自身がつけた名前で、「sum」、「mean」、「count」、「max」、「min」のように、「集約関数文字列」と呼ばれています.またagg()関数には、行、列を指定するaxisパラメータもあります.
  • df.agg(“mean”)
  • df.agg([“mean”, “sum”, “max”])
  • df.agg({「利益」:[「mean」,「sum」,「年齢」:[「max」,[min]})
  • df.agg(lambda x: x.mean())

  • ①単一集約関数文字列の入力
    df = pd.DataFrame({"  ":["A", "A", "B", "B"],
                       "  ":[10, 20, 15, 28], 
                       "  ":[20, 15, 18, 30]})
    display(df)
    
    df1 = df.groupby("  ").agg("mean")
    display(df1)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第18张图片
    ②複数の集約関数文字列の入力
    df = pd.DataFrame({"  ":["A", "A", "B", "B"],
                       "  ":[10, 20, 15, 28], 
                       "  ":[20, 15, 18, 30]})
    display(df)
    
    df1 = df.groupby("  ").agg(["sum","mean"])
    display(df1)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第19张图片
    ③辞書を入力:異なるカラムに対して、異なる集約情報を提供することができる.
    df = pd.DataFrame({"  ":["A", "A", "B", "B"],
                       "  ":[10, 20, 15, 28], 
                       "  ":[20, 15, 18, 30]})
    display(df)
    
    df1 = df.groupby("  ").agg({"  ":["sum","mean"],"  ":["max","min"]})
    display(df1)
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第20张图片
    ④入力カスタム関数
    df = pd.DataFrame({"  ":["A", "A", "A", "B", "B", "B"],
                       "  ":[10, 32, 20, 15, 28, 10], 
                       "   ":[20, 15, 33, 18, 30, 22]})
    display(df)
    
    df.groupby("  ").agg(lambda x:x.max()-x.min())
    

    結果は次のとおりです:DataFrame(14):对比MySQL学习“Pandas的groupby分组聚合”(超详细)_第21张图片