Pandas 'describe'未返回所有列的摘要
我在一个数据表上运行'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 个回答
除了使用 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
'describe()'这个函数在数据表(DataFrame)上只能处理数字类型的数据。如果你觉得某个变量应该是数字,但在'describe()'的结果中没有显示出来,可以尝试用下面的方式来改变它的类型:
df[['col1', 'col2']] = df[['col1', 'col2']].astype(float)
你也可以为混合类型的列创建新的列,以便处理其中的数字部分,或者使用字典和map()函数把字符串转换成数字。
在非数字类型的序列(Series)上使用'describe()'会给你一些统计信息,比如数量、唯一值和出现频率最高的值。
除了其他回答中提到的数据类型问题,你可能还会遇到列太多而无法全部显示的情况。如果列数过多,中间的列会被替换成三个点(...
)。
其他回答提到,describe
的 include='all'
参数可以帮助解决数据类型的问题。还有一个问题问到,"我怎么才能扩展输出显示,以便看到更多列呢?" 解决办法是修改 display.max_columns
设置,这个设置甚至可以 临时调整。比如说,如果你想从一个 describe
语句中显示最多 40 列的输出,可以这样做:
with pd.option_context('display.max_columns', 40):
print(df.describe(include='all'))
pd.options.display.max_columns = DATA.shape[1]
这行代码可以用。
这里的 DATA
是一个二维矩阵,上面的代码会把统计信息竖着显示出来。
从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,反之亦然。
只总结数字列或对象列
- 如果你只想对数字列调用
describe()
,可以使用describe(include = [np.number])
。 如果你只想对对象(字符串)调用
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