Pandas squeeze()函数可能出错

时间:2017-06-15 19:46:33

标签: python pandas numpy

我是Pandas的新用户,并且一直用它来分析BLS(劳工统计局)时间序列(从他们的ftp网站下载)。但是我在下面的Python程序中遇到了一个问题:

import pandas as pd
import numpy  as np

yvals1 = np.array( [10.] )
yvals2 = np.array( [10., 20.] )

df1 = pd.DataFrame({"yvals": yvals1})
df2 = pd.DataFrame({"yvals": yvals2})

DataFrame对象df1df2的内容符合预期:

df1: 
   yvals
0   10.0

df2: 
   yvals
0   10.0
1   20.0

但是,应用squeeze()方法会为df1df2提供不同的结果。

df1.squeeze(): 
10.0

f2.squeeze(): 
0    10.0
1    20.0
Name: yvals, dtype: float64

正如文档所预期的那样,df2.squeeze()为Pandas Series对象提供了两行,但df1.squeeze()给出了一个标量numpy.float64而不是一行的Panda Series对象。这必须是一个错误,而不是一个功能,因为当一个系列没有预先信息时,1行的系列应被视为与任何其他系列相同。

我使用的是Python 2.7.13和Pandas 0.20.1。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是预期的。如果尺寸为squeeze

,则1会消除尺寸

因此,您的大小为(2, 1)的数据框会被压缩到(2, ),并且您的大小为(1, 1)的数据框会被挤压到标量。

要获得预期结果,请使用axis=1参数

df1.squeeze(axis=1)

0    10.0
Name: yvals, dtype: float64

来自工具提示

Signature: df1.squeeze(axis=None)
Docstring:
Squeeze length 1 dimensions.

Parameters
----------
axis : None, integer or string axis name, optional
    The axis to squeeze if 1-sized.

    .. versionadded:: 0.20.0

Returns
-------
scalar if 1-sized, else original object
File:      //anaconda/envs/3.6/lib/python3.6/site-packages/pandas/core/generic.py
Type:      method