数据透视表可以按数据的值和列进行汇总统计。例如对多个数据列列连和进行求平均值。
a = pd.DataFrame([
[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 3, 4, 5],
[1, 2, 3, 2]
], columns=list("abcd"))
# 对数据生成透视表
print(a.pivot_table(values=["d"], index=["a", "b"], aggfunc=np.mean))
# Output:
# d
# a b
# 1 2 3
# 3 5
# 5 6 8
同样的。数据透视表也可以将“长格式”的数据旋转为“宽格式”。例如将堆叠格式的时间数据转化为更加可读的表。
在这个例子中。a数据表被转化为以val_1, val_2 为列的dataframe. dataframe中分别是Index(["1992","1993", "1994", "1995"], name='year') 的行索引 和 Index(["a", "b"], name='type) 的列索引。
a = pd.DataFrame([
["1992", "a", 3, 4],
["1993", "b", 7, 8],
["1994", "a", 4, 5],
["1995", "a", 3, 2]
], columns=["year", "type", "val_1", "val_2"])
# 等价于 a.set_index(['year', 'type']).unstack('type')
b = a.pivot("year", "type")
print(b)
'''
val_1 val_2
type a b a b
year
1992 3.0 NaN 4.0 NaN
1993 NaN 7.0 NaN 8.0
1994 4.0 NaN 5.0 NaN
1995 3.0 NaN 2.0 NaN
'''
这个函数可以被用来塑造对数据的初始“感觉(概览)”,通俗地讲,就是我们可以验证一些基本假设。如在贷款案例中,“Credit_History”是否会影响个人贷款成功?这可以用交叉表(Crosstab)测试,如下所示:
简单来说就是以 Credit_History 和 Loan_Status 分别为纵轴和横轴, 可以看到 Credit_History=1 与 Loan_Status=Y 的比例为 79% . 反过来 Credit_History=0 与 Loan_Status=Y 的比例为 7.8%
对数据进行有效的聚类描述更加与意义
def binning(col, col_points, labels=None):
minval = col.min()
maxval = col.max()
break_points = [minval] + col_points + [maxval] # 合并成所有的分割点
if not labels:
labels = range(len(break_points) + 1)
return pd.cut(col, bins=break_points, labels=labels, include_lowest=True)
a = pd.DataFrame([
[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 3, 4, 5],
[1, 2, 3, 2]
], columns=list("abcd"))
# 对数据按 3, 5, 7 拆分
cut_points = [3, 5, 7]
labels = ['小于3', '大于3小于5', '大于5小于7', '大于7']
a["p"] = binning(a['d'], cut_points, labels)
print(a)
'''
a b c d p
0 1 2 3 4 大于3小于5
1 5 6 7 8 大于7
2 1 3 4 5 大于3小于5
3 1 2 3 2 小于3
'''