Pandas 'describe'未返回所有列的摘要

74 投票
7 回答
151626 浏览
提问于 2025-04-18 11:50

我在一个数据表上运行'describe()'这个函数,结果只得到了整数列的总结(使用的是pandas 14.0)。

文档上说,对于对象类型的列,会返回最常见值的频率和其他一些统计信息。那可能出什么问题了呢?(顺便说一下,没有返回错误信息)

编辑:

我觉得这可能是因为这个函数在处理数据表中混合列类型时的设置。虽然文档里没有提到这一点。

示例代码:

df_test = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
df_test.dtypes
df_test.describe()
df_test['$a'] = df_test['$a'].astype(str)
df_test.describe()
df_test['$a'].describe()
df_test['$b'].describe()

我目前的一个笨办法:

def my_df_describe(df):
    objects = []
    numerics = []
    for c in df:
        if (df[c].dtype == object):
            objects.append(c)
        else:
            numerics.append(c)

    return df[numerics].describe(), df[objects].describe()

7 个回答

3

除了使用 DataFrame.describe(include = 'all') 这个方法外,我们还可以对每个分类的列使用 Series.value_counts() 来查看它们的统计信息:

In[1]:

df = pd.DataFrame({'$a':['a', 'b', 'c', 'd', 'a'], '$b': np.arange(5)})
df['$a'].value_counts()

Out[1]:
$a
a    2
d    1
b    1
c    1
5

'describe()'这个函数在数据表(DataFrame)上只能处理数字类型的数据。如果你觉得某个变量应该是数字,但在'describe()'的结果中没有显示出来,可以尝试用下面的方式来改变它的类型:

df[['col1', 'col2']] = df[['col1', 'col2']].astype(float)

你也可以为混合类型的列创建新的列,以便处理其中的数字部分,或者使用字典和map()函数把字符串转换成数字。

在非数字类型的序列(Series)上使用'describe()'会给你一些统计信息,比如数量、唯一值和出现频率最高的值。

16

除了其他回答中提到的数据类型问题,你可能还会遇到列太多而无法全部显示的情况。如果列数过多,中间的列会被替换成三个点(...)。

其他回答提到,describeinclude='all' 参数可以帮助解决数据类型的问题。还有一个问题问到,"我怎么才能扩展输出显示,以便看到更多列呢?" 解决办法是修改 display.max_columns 设置,这个设置甚至可以 临时调整。比如说,如果你想从一个 describe 语句中显示最多 40 列的输出,可以这样做:

with pd.option_context('display.max_columns', 40):
    print(df.describe(include='all'))
21

pd.options.display.max_columns = DATA.shape[1] 这行代码可以用。

这里的 DATA 是一个二维矩阵,上面的代码会把统计信息竖着显示出来。

103

从pandas版本15.0开始,你可以使用这个参数,DataFrame.describe(include = 'all'),来获取所有列的总结信息,特别是当数据框里有混合类型的列时。默认情况下,它只会给出数字列的总结。

举个例子:

In[1]:

df = pd.DataFrame({'$a':['a', 'b', 'c', 'd', 'a'], '$b': np.arange(5)})
df.describe(include = 'all')

Out[1]:

        $a    $b
count   5   5.000000
unique  4   NaN
top     a   NaN
freq    2   NaN
mean    NaN 2.000000
std     NaN 1.581139
min     NaN 0.000000
25%     NaN 1.000000
50%     NaN 2.000000
75%     NaN 3.000000
max     NaN 4.000000

对于数字列来说,涉及到对象(字符串)的总结统计会显示为NaN,反之亦然。

只总结数字列或对象列

  1. 如果你只想对数字列调用describe(),可以使用describe(include = [np.number])
  2. 如果你只想对对象(字符串)调用describe(),可以使用describe(include = ['O'])

    In[2]:
    
    df.describe(include = [np.number])
    
    Out[3]:
    
             $b
    count   5.000000
    mean    2.000000
    std     1.581139
    min     0.000000
    25%     1.000000
    50%     2.000000
    75%     3.000000
    max     4.000000
    
    In[3]:
    
    df.describe(include = ['O'])
    
    Out[3]:
    
        $a
    count   5
    unique  4
    top     a
    freq    2
    

撰写回答