【问题标题】:pandas count over multiple columns熊猫计数多列
【发布时间】:2015-12-02 14:57:13
【问题描述】:

我有一个像这样的数据框

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包,但我更喜欢pandas)

有人可以帮我吗?

【问题讨论】:

    标签: python pandas graphlab


    【解决方案1】:

    您可以通过使用ravel 和value_counts 对df 进行展平来生成计数,由此您可以构建最终的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 形状正确,但你应该明白这一点

    【讨论】:

    • 当这部分是更大的df的一部分时?所以我需要指定列?使用时:count = pd.Series(cdss_data['measure1','measure2'].squeeze().values.ravel()).value_counts() 我得到一个错误(cdss_data 是我的df)
    • 你需要双下标count = pd.Series(cdss_data[['measure1','measure2']].squeeze().values.ravel()).value_count‌​s()
    • 太棒了!有没有办法强制列的顺序和行的顺序?
    • 您可以使用精美的索引,例如:desired_col_list = [a,b,c,d] df = df.ix[:,desired_col_list] 例如
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 2015-01-28
      • 1970-01-01
      • 2016-10-21
      • 2021-05-27
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多