代码之家  ›  专栏  ›  技术社区  ›  user2205916

python:pandas数据帧的构建对象

  •  1
  • user2205916  · 技术社区  · 6 年前

    我有一个数据框 dtype=object ,即分类变量,我想知道每个级别的计数。我希望结果是所有分类变量的一个很好的总结。

    为了实现上述目标,我尝试了以下几点:

    (第1行)获取所有对象类型变量的名称

    (第2行)计算每个级别的观测数( a 我是说, b 属于 v1 )

    (第3行)将列重命名为“count”

    stringCol = list(df.select_dtypes(include=['object'])) # list object of categorical variables
    a = df.groupby(stringCol[0]).agg({stringCol[0]: 'count'})
    a = a.rename(index=str, columns={stringCol[0]: 'count'}); a
        count
    v1  
    a   1279
    b   2382
    

    我不知道如何优雅地得到下面的结果,其中所有的字符串列计数都是打印出来的。像这样(只有 第1版 v4 显示,但应该能够为可变列数打印这样的结果):

        count       count
    v1           v4
    a   1279     l  32
    b   2382     u  3055
                 y  549
    

    我的想法是:

    1. 选择一个元素 stringCol
    2. 计算列的每组的计数。
    3. 将结果存储在pandas数据框中。
    4. 将pandas数据帧存储在对象(list?)
    5. 重复
    6. if最后一个元素 斯特林科尔 结束了,休息。

    但肯定有更好的办法,只是不知道怎么做。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    我认为最简单的是使用循环:

    df = pd.DataFrame({'A':list('abaaee'),
                       'B':list('abbccf'),
                       'C':[7,8,9,4,2,3],
                       'D':[1,3,5,7,1,0],
                       'E':[5,3,6,9,2,4],
                       'F':list('aacbbb')})
    
    print (df)
       A  B  C  D  E  F
    0  a  a  7  1  5  a
    1  b  b  8  3  3  a
    2  a  b  9  5  6  c
    3  a  c  4  7  9  b
    4  e  c  2  1  2  b
    5  e  f  3  0  4  b
    

    stringCol = list(df.select_dtypes(include=['object']))
    
    for c in stringCol:
        a = df[c].value_counts().rename_axis(c).to_frame('count')
        #alternative
        #a = df.groupby(c)[c].count().to_frame('count')
        print (a)
    
       count
    A       
    a      3
    e      2
    b      1
       count
    B       
    b      2
    c      2
    a      1
    f      1
       count
    F       
    b      3
    a      2
    c      1
    

    为了 list of DataFrames 使用 list comprehension 以下内容:

    dfs = [df[c].value_counts().rename_axis(c).to_frame('count') for c in stringCol]
    print (dfs)
    
    [   count
    A       
    a      3
    e      2
    b      1,    count
    B       
    b      2
    c      2
    a      1
    f      1,    count
    F       
    b      3
    a      2
    c      1]