微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中格式化数据透视表

我试图根据不同列中的计数重新格式化表格.

df = pd.DataFrame({'Number': [1, 2, 3, 4, 5], 'X' : ['X1', 'X2', 'X3', 'X3', 'X3'], 'Y' : ['Y2','Y1','Y1','Y1', 'Y2'], 'Z' : ['Z3','Z1','Z1','Z2','Z1']})

   Number   X   Y   Z
0       1  X1  Y2  Z3
1       2  X2  Y1  Z1
2       3  X3  Y1  Z1
3       4  X3  Y1  Z2
4       5  X3  Y2  Z1

我希望顶行按频率排序X(首先是X3因为它出现两次)然后对于每个X值,计算其Y和Z值的频率并打印显示最多的那个.

   X3  X2  X1
Y  Y1  Y1  Y2           
Z  Z1  Z1  Z3

到目前为止,我有可以排序的代码

import pandas as pd

df = pd.DataFrame({'Number': [1, 2, 3, 4, 5], 'X' : ['X1', 'X2', 'X3', 'X3', 'X3'], 'Y' : ['Y2','Y1','Y1','Y1', 'Y2'], 'Z' : ['Z3','Z1','Z1','Z2','Z1']})
pivot = df.pivot_table(index='X', columns=['Y', 'Z'], values = 'Number', aggfunc='count')
# clean the table from NaNs (not necessary, but more beautiful):
pivot.fillna(0, inplace=True)
pivot['sum'] = pivot.sum(axis=1)
pivot.sort('sum', ascending=False, inplace=True)
df = pivot[:5].transpose()
df.to_csv('sorted.csv')

输出

Y   Z   X3  X1  X2
Y1  Z1  1   0   1
Y1  Z2  1   0   0
Y2  Z1  1   0   0
Y2  Z3  0   1   0
sum     3   1   1

但它仍然不是我想要的,任何人都可以帮助我吗?谢谢!

解决方法:

您将需要一个自定义模式功能,因为如果没有任何事情发生至少两次,则pandas.Series.mode不起作用;虽然下面的那个不是最有效的,但是它完成了这项工作:

>>> mode = lambda ts: ts.value_counts(sort=True).index[0]
>>> cols = df['X'].value_counts().index
>>> df.groupby('X')[['Y', 'Z']].agg(mode).T.reindex(columns=cols)
   X3  X1  X2
Y  Y1  Y2  Y1
Z  Z1  Z3  Z1

请注意,在样本框架中,X1和X2的出现次数是相关的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐