Python数据分析数据可视化-----确实比较麻烦的Pandas分组转换及透视表交叉表(持续更新中)

昨天晚上写作业写到太晚了,所以今早来补上本来昨晚该发的博客~
这篇博客首先写一下分组转换方法transform
(1)数据分组转换----transform
创建Dataframe,并按‘key1’分组求均值

df = pd.DataFrame({'data1':np.random.rand(5),
                  'data2':np.random.rand(5),
                  'key1':list('aabba'),
                  'key2':['one','two','one','two','one']})
k_mean = df.groupby('key1').mean()
print(df)
print(k_mean)

输出结果:
在这里插入图片描述
合并df和k_mean,并在每个index添加前缀‘mean_’,通过add_prefix来实现

print(pd.merge(df,k_mean,left_on='key1',right_index=True).add_prefix('mean_'))  # .add_prefix('mean_'):添加前缀

输出结果:
在这里插入图片描述
按照‘key2’分组求均值,按照‘key2’分组,并进行分组转换,使data1,data2的每个位置元素取对应分组列的均值

print(df.groupby('key2').mean()) # 按照key2分组求均值
print(df.groupby('key2').transform(np.mean))

输出结果:
在这里插入图片描述
(2)一般化Groupby方法:apply
创建Dataframe

df = pd.DataFrame({'data1':np.random.rand(5),
                  'data2':np.random.rand(5),
                  'key1':list('aabba'),
                  'key2':['one','two','one','two','one']})
print(df)

输出结果:
在这里插入图片描述
使用apply,输出Dataframe的数据信息

print(df.groupby('key1').apply(lambda x: x.describe()))

这里的 lambda为匿名函数
输出结果:
在这里插入图片描述
我们也可以自定义某些函数,再通过apply应用到Dataframe中

def f_df1(d,n):#返回排序后的前n行数据
    return(d.sort_index()[:n])
def f_df2(d,k1):#返回分组后表的k1列,结果为Series,层次化索引
    return(d[k1])
print(df.groupby('key1').apply(f_df1,2),'\n')
print(df.groupby('key1').apply(f_df2,'data2'))
print(type(df.groupby('key1').apply(f_df2,'data2')))

输出结果:
在这里插入图片描述
(3)数据透视表----pivot_table
创建数据

date = ['2017-5-1','2017-5-2','2017-5-3']*3
rng = pd.to_datetime(date)
df = pd.DataFrame({'date':rng,
                   'key':list('abcdabcda'),
                  'values':np.random.rand(9)*10})
print(df)

输出结果:
在这里插入图片描述
数据透视

print(pd.pivot_table(df, values = 'values', index = 'date', columns = 'key', aggfunc=np.sum))  # 也可以写 aggfunc='sum'

输出结果:
在这里插入图片描述
这里要注意它的一些参数:
data:Dataframe对象
values:要聚合的列或列的列表
index:数据透视表的index,从原数据的列中筛选
aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy的计算方法

以date,key共同做数据透视,值为values,统计不同(date,key)情况下values的平均值

print(pd.pivot_table(df, values = 'values', index = ['date','key'], aggfunc=len))

输出结果:
在这里插入图片描述
(4)交叉表–crosstab
在默认情况下,crosstab计算因子的频率表,比如用于str的数据透视分析
创建Dataframe

df = pd.DataFrame({'A': [1, 2, 2, 2, 2],
                   'B': [3, 3, 4, 4, 4],
                   'C': [1, 1, np.nan, 1, 1]})
print(df)

输出结果:
在这里插入图片描述
接收两个Series,提供一个频率表,用A的唯一值,统计B的唯一值出现的次数

print(pd.crosstab(df['A'],df['B']))

输出结果:
在这里插入图片描述
输出结果表示,当A=1,B=3,时,在原Dataframe中出现一次
对出现次数归一化

print(pd.crosstab(df['A'],df['B'],normalize=True))

输出结果:
在这里插入图片描述
根据‘C’列聚合
相当于以A和B界定分组,计算出每组中第三个系列C的值

print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))

这里要注意一些参数:
values:可选,根据因子聚合的值数组
aggfunc:可选,如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算
输出结果:
在这里插入图片描述
可以用过margins添加行、列边距

print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum, margins=True))

输出结果:
在这里插入图片描述
关注欢喜,走向成功~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值