参数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,则还将规范化边距值。
df1 = pd.DataFrame([[1,2,3,4],
[2,3,4,5],
[3,4,5,6]],
index=["1","2","3"],columns=["张三","李四","王五","胡六"])
df3 = df1["张三"]
df3
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的数组
pd.crosstab(index=df3,columns=df4)
得到的数据框中,行名字为“张三”,列名字为“列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计数
pd.crosstab(index=df3,columns=df4,rownames=['数字'], colnames=['字母'],margins=True)
rownames修改了“张三”,colnames修改了“列1”,margins为True则提供了行列的小计
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")
复杂例子交叉表+数据标准化
结果解析,行索引以a数组为值,行索引以b,c数组为值,
数据框中的值为:
a中第一个元素和b中第一个元素加c中第一个元素 foo+one+dull,计数一次
a中第二个元素和b中第二个元素加c中第二个元素 foo+one+dull,计数第二次
……
以此类推,直至abc中最后一组元素,计数一次,得到下表
复杂例子交叉表
参数margins_name:给行列小计起个名字,这里是“总和”
参数normalize:给数据进行标准化,可见上边数据标准化示图,可选值见上文第一大部分
foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
pd.crosstab(foo, bar ,dropna=True)
foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
pd.crosstab(foo, bar, dropna=False)
参数dropna的True和False的区别为是否对全部为NaN的列进行显示