为什么pandas.to_numeric导致列表列表?

时间:2019-03-27 14:29:20

标签: python pandas

我正在尝试将csv数据导入到pandas数据框中。为此,我正在执行以下操作:

center   device   count
1        d1       2
1        d2       2
1        d5       1
3        d5       1
3        d6       1

这会产生例如下表:

df = pd.read_csv(StringIO(contents), skiprows=4, delim_whitespace=True,index_col=False,header=None)
index = pd.MultiIndex.from_arrays((columns,  units, descr))
df.columns = index
df.columns.names = ['Name','Unit','Description']
df = df.apply(pd.to_numeric)
data['isotherm'] = df

但是,如果我只想获取列In: data['isotherm'] Out: Name Relative_Pressure Volume_STP Unit - ccm/g Description p/p0 0 0.042691 29.3601 1 0.078319 30.3071 2 0.129529 31.1643 3 0.183355 31.8513 4 0.233435 32.3972 5 0.280847 32.8724 的值,则会得到以下输出:

Relative_Pressure

当然我现在可以为要使用展平的每一列

In: data['isotherm']['Relative_Pressure'].values
Out:
array([[0.042691],
       [0.078319],
       [0.129529],
       [0.183355],
       [0.233435],
       [0.280847]])

但是,这将导致很多额外的工作,并且还会降低可读性。我如何才能确保整个数据框架平坦?

2 个答案:

答案 0 :(得分:3)

array([[...]])不是列表列表,而是2D numpy数组。 (不过,我不确定为什么在这里将值作为单列2D数组而不是1D数组返回。创建原始DataFrame时,单列的值作为1D数组返回。)

您可以使用numpy的内置函数来将它们串联和展平。

x = data['isotherm']['Relative_Pressure'].flatten()

编辑:这可能是由MultiIndex引起的。

答案 1 :(得分:0)

索引到属于MultiIndex对象的一列的直接方法是使用tuple,如下所示:

data[('isotherm', 'Relative_Pressure')]

,它将返回一个Series对象,该对象的.values属性将为您提供预期的一维数组。文档讨论了here

使用data['isotherm']['Relative_Pressure']之类的链接索引时应格外小心,因为您将不知道要处理数据的副本还是数据的视图。请对熊猫的SettingWithCopyWarning进行SO搜索以获取更多详细信息,或阅读文档here