作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含客户、商品类别及其价格的超大型数据框。我想做一些初步调查:
这需要旋转和排序。这是一个样本数据生成器,感谢 here .
import numpy as np
import pandas as pd
from numpy.core.defchararray import add
np.random.seed(42)
n = 20
cols = np.array(['cust', 'cat'])
arr1 = (np.random.randint(5, size=(n, 2)) // [2, 1]).astype(str)
df = pd.DataFrame(
add(cols, arr1), columns=cols
).join(
pd.DataFrame(np.random.rand(n, 1).round(2)).add_prefix('val')
)
print(df)
df.pivot_table(index=['cust'],values=['val0'],aggfunc=[np.sum])
df.pivot_table(index=['cust','cat'],values=['val0'],aggfunc=[np.size,np.sum])
# the order according the previous line should be cust1,cust0,cust2. How to do? The following is the desired output in this case.
size sum
val0 val0
cust cat
cust1 cat4 6.0 4.27
cat3 2.0 1.07
cat2 2.0 0.98
cat0 2.0 0.44
cat1 2.0 0.43
cust0 cat1 1.0 0.94
cat4 1.0 0.91
cat2 1.0 0.66
cat3 1.0 0.03
cust2 cat1 2.0 1.25
非常感谢!
最佳答案
这是更好的聚合sum
避免MultiIndex
在列中。
第一个聚合sum
:
s = df.groupby('cust')['val0'].sum()
print (s)
cust
cust0 2.54
cust1 7.19
cust2 1.25
Name: val0, dtype: float64
然后通过 Series.nlargest
获取最高值:
top5 = s.nlargest(5)
print (top5)
cust
cust1 7.19
cust0 2.54
cust2 1.25
Name: val0, dtype: float64
如有必要,仅按 boolean indexing
过滤前 5 个值和 isin
:
df1 = df[df['cust'].isin(top5.index)].copy()
#print(df1)
正确订购cust
创建有序分类并按两个过滤列进行聚合,最后按第一级排序 cust
带柱size
:
df1['cust'] = pd.Categorical(df1['cust'], ordered=True, categories=top5.index)
df2 = (df1.groupby(['cust','cat'])['val0'].agg([np.size,np.sum])
.sort_values(['cust','size'], ascending=[True, False])
.reset_index())
print (df2)
cust cat size sum
0 cust1 cat4 6.0 4.27
1 cust1 cat0 2.0 0.44
2 cust1 cat1 2.0 0.43
3 cust1 cat2 2.0 0.98
4 cust1 cat3 2.0 1.07
5 cust0 cat1 1.0 0.94
6 cust0 cat2 1.0 0.66
7 cust0 cat3 1.0 0.03
8 cust0 cat4 1.0 0.91
9 cust2 cat1 2.0 1.25
最后一个枢轴和绘图 DataFrame.plot.bar
:
df2.pivot('cust','cat','size').plot.bar()
关于python - 如何在Python中对两列进行透视和排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54672120/
我是一名优秀的程序员,十分优秀!