【问题标题】:Python: build object of Pandas dataframesPython:构建 Pandas 数据框的对象
【发布时间】:2018-12-09 05:49:07
【问题描述】:

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

为了实现上述目标,我尝试了以下方法:

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

(第 2 行)计算每个级别的观察次数(ab of 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

我不确定如何优雅地获得以下打印所有字符串列计数的结果。像这样(仅显示v1v4,但应该能够为可变数量的列打印这样的结果):

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

我能想到的做法是:

  1. 选择stringCol的一个元素
  2. 计算每组列的计数。
  3. 将结果存储在 Pandas 数据框中。
  4. 将 Pandas 数据框存储在对象中(列表?)
  5. 重复
  6. 如果stringCol 的最后一个元素完成,则中断。

但一定有比这更好的方法,只是不知道该怎么做。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    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]
    

    【讨论】:

    • 是的,这好多了。不知道这些功能,并且在不知道相关关键术语的情况下很难通过谷歌了解它们的存在。有没有办法让它们并排打印以避免滚动结果?相关的 bc 可能有 1x10^n 数量级的列,其中 n>=2
    • @user2205916 - 是的,但有点复杂,请查看this
    • 为了使用您发布的链接中的解决方案,我必须通过循环为每次迭代创建一个数据框。然后,我想我必须将每个数据帧存储到另一个对象中(会是什么?)
    • 您可以查看this
    • 谢谢,您对完善这一点很有帮助。 .value_counts(normalize=True) 实际上会产生浮点数,因为它给出了比例。即 0.9 值为“真”,0.1 值为“假”
    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 2018-03-15
    • 1970-01-01
    • 2013-06-02
    • 2019-10-22
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多