python Pandas.crosstab()函数 参数详解,例子解析

 一.首先我们拿出Pandas官方指南里的函数参数,如下:

Parameters 参数

参数1:index        #简单说就是行数据

array-like, Series, or list of arrays/Series

类似索引数组、系列或数组/系列列表

Values to group by in the rows.
行中要作为分组依据的值。

参数2:columns        #简单说就是列数据

array-like, Series, or list of arrays/Series
列类数组、系列或数组列表/系列

Values to group by in the columns.
列中要作为分组依据的值。

参数3:values          #可选,很少用

array-like, optional 值数组类,可选

Array of values to aggregate according to the factors. Requires aggfunc be specified.
要根据因子聚合的值数组。需要指定 aggfunc。

参数4:rownames        #给所有行起个行标签,下文会有解释

sequence, default None 行名序列,默认为无

If passed, must match number of row arrays passed.
如果传递,则必须与传递的行数组数匹配。

参数5:colnames        #给所有列起个列标签,下文会有解释

sequence, default None 同名序列,默认为无

If passed, must match number of column arrays passed.
如果传递,则必须与传递的列数组数匹配。

参数6:  aggfunc        #可选,很少用

function, optional aggfuncfunction, 可选

If specified, requires values be specified as well.
如果指定,则还需要指定值。

参数7:margins        #添加行列计数小计,包含行列总和

bool, default False 边距布尔,默认为假

Add row/column margins (subtotals).
添加行/列边距(小计)。

参数8:margins_name        #给参数6小计行列添加名字

str, default ‘All’ margins_namestr,默认为“全部”

Name of the row/column that will contain the totals when margins is True.
当边距为 True 时将包含总计的行/列的名称。

参数9:dropna        #Ture则不包含全为NaN的列,False则显示结果含全为NaN的列

bool, default True dropnabool,默认为 True

Do not include columns whose entries are all NaN.
不要包含条目全部为 NaN 的列。

参数10:normalize        #对计数值进行规范化

bool, {‘all’, ‘index’, ‘columns’}, or {0,1}, default False
normalizebool, {'all', 'index', 'columns'}, or {0,1}, default False

Normalize by dividing all values by the sum of values.
通过将所有值除以值的总和来规范化。

  • If passed ‘all’ or True, will normalize over all values.
    如果传递“all”或 True,则将对所有值进行规范化。

  • If passed ‘index’ will normalize over each row.               
    如果传递“索引”将在每一行上规范化。

  • If passed ‘columns’ will normalize over each column.
    如果传递“列”,则会在每列上规范化。

  • If margins is True, will also normalize margin values.
    如果边距为 True,则还将规范化边距值。

二.结合例子理解参数

1.简单例子

df1 = pd.DataFrame([[1,2,3,4],
                    [2,3,4,5],
                    [3,4,5,6]],
index=["1","2","3"],columns=["张三","李四","王五","胡六"])
df3 = df1["张三"]
df3

python Pandas.crosstab()函数 参数详解,例子解析_第1张图片

df3运行结果:行索引为1,2,3,

列值为1,2,3的数组

df2 = pd.DataFrame([["a","b","c","d"],
            ["b","c","d","e"],
            ["c","d","e","f"]],
index=["1","2","3"],columns=["列1","列2","列3","列4"])
df4 = df2["列1"]
df4

 df4运行结果:行索引为1,2,3 

列值为a,b,c的数组

 #这里运用文章函数pandas.crosstab(),使用参数index,参数columns

pd.crosstab(index=df3,columns=df4)

 

python Pandas.crosstab()函数 参数详解,例子解析_第2张图片

 得到的数据框中,行名字为“张三”,列名字为“列1”,是因为上文df1中通过选取张三字段得到df3,df2中通过选取列1 字段得到df4,两者连结成交叉表得到上图行列的名字。

且上图中的01计数,则为a1记为1次,b2记为1次,c3记为1次,

是df4中的第一个元素a和df3中的第一个元素1,组合成a1,记为1次

df4中的第二个元素b和df3中的第二个元素2,组合成b2,记为1次

df4中的第三个元素c和df3中的第三个元素3,组合成c3,记为1次,

没有其他组合了,则为0计数

#这里运用文章函数pandas.crosstab(),使用参数rownames,参数colnames,

参数margins

pd.crosstab(index=df3,columns=df4,rownames=['数字'], colnames=['字母'],margins=True)

python Pandas.crosstab()函数 参数详解,例子解析_第3张图片

 

 rownames修改了“张三”,colnames修改了“列1”,margins为True则提供了行列的小计

2.复杂例子

#这里运用文章函数pandas.crosstab(),新使用参数margins_name,参数normalize

a = np.array(["foo", "foo", "foo", "foo", "bar", "bar",
            "bar", "bar", "foo", "foo", "foo"], dtype=object)
b = np.array(["one", "one", "one", "two", "one", "one",
              "one", "two", "two", "two", "one"], dtype=object)
c = np.array(["dull", "dull", "shiny", "dull", "dull", "shiny",
              "shiny", "dull", "shiny", "shiny", "shiny"],dtype=object)
pd.crosstab(a, [b, c], 
rownames=['a'], 
colnames=['b', 'c'],
margins=True,
margins_name="总和",
normalize="all")

python Pandas.crosstab()函数 参数详解,例子解析_第4张图片 复杂例子交叉表+数据标准化

 

结果解析,行索引以a数组为值,行索引以b,c数组为值,

数据框中的值为:

a中第一个元素和b中第一个元素加c中第一个元素   foo+one+dull,计数一次

a中第二个元素和b中第二个元素加c中第二个元素   foo+one+dull,计数第二次

……

以此类推,直至abc中最后一组元素,计数一次,得到下表

 

python Pandas.crosstab()函数 参数详解,例子解析_第5张图片 复杂例子交叉表

参数margins_name:给行列小计起个名字,这里是“总和”

参数normalize:给数据进行标准化,可见上边数据标准化示图,可选值见上文第一大部分

#这里运用文章函数pandas.crosstab(),新使用参数dropna

foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
pd.crosstab(foo, bar ,dropna=True)

python Pandas.crosstab()函数 参数详解,例子解析_第6张图片

foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
pd.crosstab(foo, bar, dropna=False)

 python Pandas.crosstab()函数 参数详解,例子解析_第7张图片

 参数dropna的True和False的区别为是否对全部为NaN的列进行显示

三.谢谢大家的浏览,一起进步,GO!


你可能感兴趣的:(pandas,python,pandas,数据分析)