Pandas + scikit-learn - 如何将二维数组转换应用于 DataFrame

Posted

技术标签:

【中文标题】Pandas + scikit-learn - 如何将二维数组转换应用于 DataFrame【英文标题】:Pandas + scikit-learn - how to apply 2D-array transformations to a DataFrame 【发布时间】:2018-09-19 18:52:05 【问题描述】:

背景

scikit-learn API 基于有状态对象,它将 2D numpy 数组作为输入,计算转换(在对象内部,在对象内部),然后将其应用于其他 2D 数组。例如:

arr = np.arange(4).reshape(2,2)
scaler = sklearn.preprocessing.StandardScaler()
scaler.fit(arr) # scaler state has changed, nothing returns
scaler.transform(arr) # a transformed version of arr returns

我的问题

我想对存储在pandas DataFrame 中的数据应用转换,并将转换后的数据放回同一个 DataFrame。

问题在于df.apply(scaler.transform) 将数据逐列(一维数组)输入到缩放器中,其中缩放器需要一个二维数组。

按照here 和here 的答案,我目前正在做:

transformed_array = scaler.transform(df.values)
transformed_df = pd.DataFrame(data=transformed_array, index=df.index, columns=df.columns)

但这似乎相当笨重且效率低下。另外,我觉得在极端情况下我会丢失 DataFrame 的元数据。

有没有更好的办法?

【问题讨论】:

【参考方案1】:

您可以使用iloc[:,:]

根据documentation

Pandas 提供了一套方法来获取纯整数 基于索引。语义紧跟 python 和 numpy 切片。 这些是基于 0 的索引。切片时,起始边界为 包括在内,而排除上限。请注意,设置也有效。

例子:

df = pd.DataFrame([[1, 2.], [3, 4.]], columns=['a', 'b'])
df2 = pd.DataFrame([[3, 4.], [5, 6.]], columns=['c', 'd'])

df.iloc[:,:]=df2.values
print(df)
     a    b
0  3.0  4.0
1  5.0  6.0

所以在你的情况下,它将是:

df.iloc[:,:] = scaler.transform(df.values) # On an already fitted scaler

【讨论】:

谢谢,您知道这样的分配是否比使用构造函数效率更高/更低?从这个意义上说,iloc 也比 loc 更好? @OmerB 不,对不起,我不了解性能。但是.loc 不能用于此,因为那是基于标签的索引。在“.loc”中,您不能指定条目索引。 但我可以.loc[:,:] 甚至只是df[:]...它们可能都是等效的,但我会等着看是否有人对此有明确的答案...跨度> @OmerB 他们在性能方面并不相同:***.com/a/45983830/4016674【参考方案2】:

考虑以下演示:

In [198]: df = (pd.DataFrame(np.random.randint(10**5, size=(5,3)), columns=list('abc'))
                  .assign(d=list('abcde')))

In [199]: df
Out[199]:
       a      b      c  d
0  17821  80092  11803  a
1  91198  19663  78665  b
2  77674  46347  72550  c
3  67390  63699  16347  d
4  50445  31346  95608  e

In [200]: cols = ['a','b','c']

In [201]: df[cols] = scaler.fit_transform(df[cols])

In [202]: df
Out[202]:
          a         b         c  d
0 -1.701325  1.466854 -1.259806  a
1  1.196186 -1.315108  0.690414  b
2  0.662151 -0.086660  0.512053  c
3  0.256056  0.712172 -1.127267  d
4 -0.413068 -0.777259  1.184605  e

【讨论】:

以上是关于Pandas + scikit-learn - 如何将二维数组转换应用于 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

为 Scikit-Learn 向量化 Pandas 数据框

使用 Pandas 为 Scikit-Learn 准备 CSV 文件数据?

将 scikit-learn (sklearn) 预测添加到 pandas 数据帧

第五篇 pandas??

将 pandas TimeStamp 与 scikit-learn 一起使用

pandas小结