【问题标题】:How to do value_counts on each row and make some columns whose values are the counts of each value如何在每一行上做 value_counts 并制作一些其值是每个值的计数的列
【发布时间】:2019-07-28 23:43:40
【问题描述】:

我得到如下数据框:

df
     c1  c2  c3  c4  c5  c6  c7  c8  c9  c10 c11 c12
r1   0   1   1   1   1   0   0   0   0   0   0   0
r2   1   2   2   2   2   1   1   1   1   0   0   0      
r3   1   0   2   0   0   1   0   0   0   0   0   0      


func(df)
     0   1   2
r1   8   4   0
r2   3   5   4
r3   9   2   1

我想在每一行上执行value_counts 并获得与每个值的计数相对应的 3 列。
我的想法是在每一行中做melt(),获取值计数并将其填充到相应的位置。但我认为这不是一种足够聪明和方便的方式。
所以如果不介意有人可以帮助我吗?
提前致谢。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

尝试使用简单的pd.Series.value_countsfillna0

df.apply(pd.Series.value_counts, axis=1).fillna(0)
     0   1   2
r1   8   4   0
r2   3   5   4
r3   9   2   1

【讨论】:

【解决方案2】:

直截了当(Dataframe.apply + pandas.Series.value_counts):

In [232]: df.apply(lambda s: s.value_counts(), axis=1).fillna(0)                                                  
Out[232]: 
      0    1    2
r1  8.0  4.0  0.0
r2  3.0  5.0  4.0
r3  9.0  2.0  1.0

【讨论】:

    【解决方案3】:

    这是一种方法

    df.stack().groupby(level=0).value_counts().unstack(fill_value=0)
        0  1  2
    r1  8  4  0
    r2  3  5  4
    r3  9  2  1
    

    crosstab 应该很快:-)

    s=df.reset_index().melt('index')
    pd.crosstab(s['index'],s.value)
    value  0  1  2
    index         
    r1     8  4  0
    r2     3  5  4
    r3     9  2  1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多