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
構文の順序:
論理実行順序:
② pandas
構文順序と論理実行順序:
③図示説明
まず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より大きい部門、給料を求めます;
②mysqiでのコード実行は以下の通りです.
結果は次のとおりです:
③pandasでのコード実行は次のとおりです.
結果は次のとおりです:
2、groupbyグループ重合の原理説明
1)原理図
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パラメータの使用図 ③パラメータas_indexの使用説明
結果は次のとおりです:
2)groupbyグループ化オブジェクトの一般的な方法または属性.
1 groupsプロパティ:辞書を返します.keyはグループ名を表し、valueはこのグループのすべてのレコードを表します.
②size()メソッド:各パケットのレコード数を返します.
結果は次のとおりです:
3)forループを使用してgroupby()グループオブジェクトの各グループの具体的なデータを印刷する
結果は以下の通りである:)groupby()パケットパラメータの4つの形式単一フィールドパケット:dfのあるフィールドに基づいてパケット化される. マルチフィールドパケット:df内の複数のフィールドに基づいてコンビネーションパケットを行う. 辞書またはSeries:keyはインデックスを指定し、valueはグループ化の根拠、すなわちvalue値が等しいレコードを指定し、グループに分けられます. カスタム関数:インデックスを受け入れ、インデックスが同じレコードをグループ化します.
次のデータを使用して、4つのグループ化パラメータを実証します.
結果は次のとおりです:
①単一フィールドグループ化:dfのいずれかのフィールドに従ってグループ化する.
結果は次のとおりです:
②マルチフィールドパケット:df内の複数のフィールドに従ってコンビネーションパケットを行う.
結果は次のとおりです:
③辞書:keyはインデックスを指定し、valueはパケット根拠、すなわちvalue値が等しいレコードを指定し、グループに分けます.
結果は次のとおりです:
④Series:グループソート(重要)
結果は次のとおりです:
⑤カスタム関数:部門A、Bを一組に分け、Cを一組にする(特別な需要)
結果は次のとおりです:
4、agg()重合操作に関する説明
groupby()パケットを使用すると、パケットオブジェクトが得られます.groupby()パケットが使用されていない場合、テーブル全体は1つのグループと見なすことができ、1つのパケットオブジェクトにも相当する. パケットオブジェクトに対して、集約関数sum()、mean()、count()、max()、min()を直接呼び出すこともできます.また、agg()に指定されたパラメータが入力されるように、パケットオブジェクトのagg()メソッドを呼び出すこともできます.
1)グループ化されたオブジェクトに対して直接集約関数を呼び出す
①dfテーブル全体に対して、集約関数を直接呼び出す
結果は次のとおりです:
②dfパケット後のオブジェクトに対して、集約関数を直接呼び出す
結果は次のとおりです:
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())
①単一集約関数文字列の入力
結果は次のとおりです:
②複数の集約関数文字列の入力
結果は次のとおりです:
③辞書を入力:異なるカラムに対して、異なる集約情報を提供することができる.
結果は次のとおりです:
④入力カスタム関数
結果は次のとおりです:
1、MySQLとPandasのグループ化の比較説明
1)いずれも表データの処理に用いる
mysqlでもpandasでもexcelのような2次元テーブルデータを処理します.2 Dテーブルの場合、各ローはレコードとみなされ、各カラムはフィールドとみなされます.
2)グループ化のスタイルが違う
mysqlを学んだことがある人はみな知っています.mysqlはデータ処理と統計分析をするとき、文法の順序と実行の順序が一致していないので、多くの初心者がsql文を書き間違えやすいという大きな痛みがあります.業界ではexcelのような2 Dテーブルデータを処理しています.通常、次の2つのスタイルがあります.
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"})
③図示説明
4)MySQLとPandasのグループ化の一例
1異なるdeptno(部門)の下で、sal(給料)が8000より大きい部門、給料を求めます;
②mysqiでのコード実行は以下の通りです.
select deptno,sum(sal) sums
from emp
group by deptno
having sums > 9000;
結果は次のとおりです:
③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)
結果は次のとおりです:
2、groupbyグループ重合の原理説明
1)原理図
2)原理説明
3、groupbyグループオブジェクトの関連操作
グループ化はgroupbyメソッドによってSeriesまたはDataFrameオブジェクトに対してグループ化操作を実現することができ、このメソッドはグループ化オブジェクトを返す.ただし、オブジェクトを直接表示(出力)すると、パケット情報は表示されません.
1)groupby()関数構文
①文法は以下の通り
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"})
結果は次のとおりです:
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()
結果は次のとおりです:
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)
結果は以下の通りである:)groupby()パケットパラメータの4つの形式
次のデータを使用して、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)
結果は次のとおりです:
①単一フィールドグループ化:dfのいずれかのフィールドに従ってグループ化する.
g = df.groupby(" ")
display(g)
for (x,y) in g:
display(x, y)
結果は次のとおりです:
②マルチフィールドパケット:df内の複数のフィールドに従ってコンビネーションパケットを行う.
g = df.groupby([" "," "])
display(g)
for (x,y) in g:
display(x, y)
結果は次のとおりです:
③辞書:keyはインデックスを指定し、valueはパケット根拠、すなわちvalue値が等しいレコードを指定し、グループに分けます.
g = df.groupby({0:1, 1:1, 2:1, 3:2})
display(g)
for (x,y) in g:
display(x, y)
結果は次のとおりです:
④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
結果は次のとおりです:
⑤カスタム関数:部門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)
結果は次のとおりです:
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()
結果は次のとおりです:
②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()
結果は次のとおりです:
2)グループ化オブジェクトに対してagg()関数を直接呼び出す(重要)
以下の知識の説明では、「集約関数文字列」について説明します.これは私自身がつけた名前で、「sum」、「mean」、「count」、「max」、「min」のように、「集約関数文字列」と呼ばれています.またagg()関数には、行、列を指定するaxisパラメータもあります.
①単一集約関数文字列の入力
df = pd.DataFrame({" ":["A", "A", "B", "B"],
" ":[10, 20, 15, 28],
" ":[20, 15, 18, 30]})
display(df)
df1 = df.groupby(" ").agg("mean")
display(df1)
結果は次のとおりです:
②複数の集約関数文字列の入力
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)
結果は次のとおりです:
③辞書を入力:異なるカラムに対して、異なる集約情報を提供することができる.
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)
結果は次のとおりです:
④入力カスタム関数
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())
結果は次のとおりです: