在numpy/scikit函数中保持pandas结构

13 投票
2 回答
3907 浏览
提问于 2025-04-17 15:29

我正在使用pandas库里非常好用的read_csv()函数,它可以读取CSV文件,结果是:

In [31]: data = pandas.read_csv("lala.csv", delimiter=",")

In [32]: data
Out[32]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 12083 entries, 0 to 12082
Columns: 569 entries, REGIONC to SCALEKER
dtypes: float64(51), int64(518)

但是当我用scikit-learn里的一个函数时,我就失去了关于列的信息:

from sklearn import preprocessing
preprocessing.scale(data)

结果变成了numpy数组。

有没有办法在不丢失信息的情况下,把scikit或numpy的函数应用到DataFrame上呢?

2 个回答

19

这可以通过把返回的数据放进一个数据框(dataframe)来实现,里面包含了index(索引)和columns(列)的信息。

import pandas as pd
pd.DataFrame(preprocessing.scale(data), index = data.index, columns = data.columns) 
9

一种(稍微简单点的)方法是把你的数据框的结构,比如它的列和索引,单独存起来,然后根据你处理过的结果创建一个新的数据框,像这样:

In [15]: data = np.zeros((2,2))

In [16]: data
Out[16]: 
array([[ 0.,  0.],
       [ 0.,  0.]])

In [17]: from pandas import DataFrame

In [21]: df  = DataFrame(data, index = ['first', 'second'], columns=['c1','c2'])

In [22]: df
Out[22]: 
        c1  c2
first    0   0
second   0   0

In [26]: i = df.index

In [27]: c = df.columns

# generate new data as a numpy array    
In [29]: df  = DataFrame(np.random.rand(2,2), index=i, columns=c)

In [30]: df
Out[30]: 
              c1        c2
first   0.821354  0.936703
second  0.138376  0.482180

正如你在 Out[22] 中看到的,我们一开始有一个数据框,然后在 In[29] 中我们把一些新数据放进这个框里,行和列都没有改变。我假设你的预处理不会改变数据的行和列顺序。

撰写回答