如何在交叉表中添加额外的行和附加列?
df = pd.DataFrame({"A": np.random.randint(0,2,100), "B" : np.random.randint(0,2,100)})
ct = pd.crosstab(new.A, new.B)
ct
我以为我会通过
添加新列(通过对行进行求和得到)ct["Total"] = ct.0 + ct.1
但这不起作用。
答案 0 :(得分:15)
事实上,pandas.crosstab
已经提供了一个选项margins
,它可以完全满足您的需求。
> df = pd.DataFrame({"A": np.random.randint(0,2,100), "B" : np.random.randint(0,2,100)})
> pd.crosstab(df.A, df.B, margins=True)
B 0 1 All
A
0 26 21 47
1 25 28 53
All 51 49 100
基本上,通过设置margins=True
,生成的频率表将添加一个"全部"列和"全部"计算小计的行。
答案 1 :(得分:3)
这是因为'属性类似'列访问不适用于整数列名称。使用标准索引:
In [122]: ct["Total"] = ct[0] + ct[1]
In [123]: ct
Out[123]:
B 0 1 Total
A
0 26 24 50
1 30 20 50
请参阅文档中http://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
的本节末尾的警告如果要处理行,可以使用.loc
:
In [126]: ct.loc["Total"] = ct.loc[0] + ct.loc[1]
在这种情况下,ct.loc["Total"]
相当于ct.loc["Total", :]
答案 2 :(得分:0)
您应该使用margin = True和交叉表。那应该可以胜任!