大熊猫算过多个列

问题描述:

我有一个数据帧寻找这样大熊猫算过多个列

Measure1 Measure2 Measure3 ... 
0  1   3 
1  3   2 
3  0   

我想在列数的值的出现,产生:

Measure Count Percentage 
0  2  0.25 
1  2  0.25 
2  1  0.125 
3  3  0.373 

随着

outcome_measure_count = cdss_data.groupby(key_columns=['Measure1'],operations={'count': agg.COUNT()}).sort('count', ascending=True) 

我只得到第一列(实际上使用graphlab包,但我更喜欢大熊猫)

有人可以帮我吗?

您可以通过扁平化利用ravelvalue_counts东风,从这里就可以构成最终的DF产生计数:

In [230]: 
import io 
import pandas as pd 
​ 
t="""Measure1 Measure2 Measure3 
0  1   3 
1  3   2 
3  0  0""" 
​ 
df = pd.read_csv(io.StringIO(t), sep='\s+') 
df 

Out[230]: 
    Measure1 Measure2 Measure3 
0   0   1   3 
1   1   3   2 
2   3   0   0 

In [240]:  
count = pd.Series(df.squeeze().values.ravel()).value_counts() 
pd.DataFrame({'Measure': count.index, 'Count':count.values, 'Percentage':(count/count.sum()).values}) 

Out[240]: 
    Count Measure Percentage 
0  3  3 0.333333 
1  3  0 0.333333 
2  2  1 0.222222 
3  1  2 0.111111 

我插入了0只是为了让DF形状正确的,但你应该得到的点

+0

而当这部分是一个更大的df的一部分?所以我需要指定列?当使用:count = pd.Series(cdss_data ['measure1','measure2']。squeeze()。values.ravel())。value_counts()我得到一个错误(cdss_data是我的df) – dsent

+0

您需要双下标'count = pd.Series(cdss_data [['measure1','measure2']]。squeeze()。values.ravel())。value_count s()' – EdChum

+0

太棒了!有没有办法强制行的顺序和顺序? – dsent

In [68]: df=DataFrame({'m1':[0,1,3], 'm2':[1,3,0], 'm3':[3,2, np.nan]}) 

In [69]: df 
Out[69]: 
    m1 m2 m3 
0 0 1 3.0 
1 1 3 2.0 
2 3 0 NaN 

In [70]: df=df.apply(Series.value_counts).sum(1).to_frame(name='Count') 

In [71]: df 
Out[71]: 
    Count 
0.0 2.0 
1.0 2.0 
2.0 1.0 
3.0 3.0 

In [72]: df.index.name='Measure' 

In [73]: df 
Out[73]: 
     Count 
Measure 
0.0  2.0 
1.0  2.0 
2.0  1.0 
3.0  3.0 

In [74]: df['Percentage']=df.Count.div(df.Count.sum()) 

In [75]: df 
Out[75]: 
     Count Percentage 
Measure 
0.0  2.0  0.250 
1.0  2.0  0.250 
2.0  1.0  0.125 
3.0  3.0  0.375