Python 2.7 基于多个条件获取pivot中的前n条记录,并使用matplotlib进行打印
用例:扩展Pandas的枢轴功能获取前n条记录并根据其自身的“点击%”(s)与该名称记录的数量进行绘图Python 2.7 基于多个条件获取pivot中的前n条记录,并使用matplotlib进行打印,python-2.7,numpy,matplotlib,pandas,pivot,Python 2.7,Numpy,Matplotlib,Pandas,Pivot,用例:扩展Pandas的枢轴功能获取前n条记录并根据其自身的“点击%”(s)与该名称记录的数量进行绘图 import pandas as pd import numpy as np df1 = pd.DataFrame({'name':['A', 'A', 'B', 'B','C','A'], 'click':[1,1,0,1,1,0]}) click name 0 1 A 1 1 A 2 0 B 3 1 B 4
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'name':['A', 'A', 'B', 'B','C','A'], 'click':[1,1,0,1,1,0]})
click name
0 1 A
1 1 A
2 0 B
3 1 B
4 1 C
5 0 A
[6 rows x 2 columns]
#fraction of records present & clicks as a fraction of it's OWN records present
f=df1.pivot_table(rows='name', aggfunc=[len, np.sum])
f['len']['click']/sum(f['len']['click']) , f['sum']['click']/sum(f['sum']['click'])
(name
A 0.500000
B 0.333333
C 0.166667
Name: click, dtype: float64, name
A 0.50
B 0.25
C 0.25
Name: click, dtype: float64)
但是为了能够打印它们,需要将前n条记录存储在matplotlib支持的对象中。
我试着把它储存起来
通过创建dict(输出
f['len']['click']/sum(f['len']['click']
))-并按值排序-之后我将“click%”[A->0.50,B->0.25,C->0.25]
也存储在同一个字典中
**这显然是一种过激的行为——想知道是否有一种更像蟒蛇的方式来做到这一点**强>
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'name':['A', 'A', 'B', 'B','C','A'], 'click':[1,1,0,1,1,0]})
click name
0 1 A
1 1 A
2 0 B
3 1 B
4 1 C
5 0 A
[6 rows x 2 columns]
#fraction of records present & clicks as a fraction of it's OWN records present
f=df1.pivot_table(rows='name', aggfunc=[len, np.sum])
f['len']['click']/sum(f['len']['click']) , f['sum']['click']/sum(f['sum']['click'])
(name
A 0.500000
B 0.333333
C 0.166667
Name: click, dtype: float64, name
A 0.50
B 0.25
C 0.25
Name: click, dtype: float64)
我也试过用groupby子句来代替head,但它并没有给出我想要的东西。我正在寻找如上所述的数据帧
A 50万美元
B 0.333
C 0.166667
名称:单击,数据类型:float64,名称
A 0.50
B 0.25
C 0.25
除了应该嵌入top n逻辑(head(n)不与n一起工作取决于我的数据集-我想我需要使用“apply”?-并在此发布对象,它是一个“”对象,需要由matplotlib用自己的标签标识(此处为top n“name”)
这是我的dict函数实现:-#按照上面的自定义标准,仅获取前n名是一种过分的做法
def freq_counts(df_var,n): # df_var is like df1.name , just to make the top n logic generic for each column name
perct_freq=dict((df_var.value_counts()*100)/len(df_var))
vec=[]
for key,value in perct_freq.items():
if value>=n :
vec.append([key,value])
return vec
freq_counts(df1.name,3) # eg. top 3 freq counts - to get the names, see vec[i][0] which has the corresponding keys
#In this example when I calculate the "perct_freq", which is a Series object, I would ideally want to avoid converting this to a dict - What an overkill !
(2) is>f['sum']['click']/sum(f['sum']['click'])
在我运行“=df1.pivot_table(rows='name',aggfunc=[len,np.sum])之后,您是否尝试过(f.astype('float')/f.sum()).sort(['len',sum',升序=False)[:3]@user1827356,然后您的命令给出了“ValueError:无法按重复列len排序”。在我删除“len”后,给出了“%str(by))ValueError:无法按重复列sum排序顺便说一句,为什么我们要将“f”输入浮动。错误的原因是pandas没有很好地处理多索引列。您可以在sort-f.columns=f.columns.levels[0]2之前执行此操作。如果不将cast键入“float”,则除法返回0而不是分数(整数div)