如何在 pandas 系列列表中使用 OneHotEncoder?
Posted
技术标签:
【中文标题】如何在 pandas 系列列表中使用 OneHotEncoder?【英文标题】:How do I use OneHotEncoder on a pandas series of lists? 【发布时间】:2018-10-06 10:20:38 【问题描述】:我有一个包含一系列列表的 Pandas 数据框。我想在这个系列中使用 SciKit-Learn 的 OneHotEncoder。我不断收到值错误。
我的问题被转载为:
import pandas as pd
import numpy as np
d = 'A': [[5,7], [3, 4, 5], [2], [1,2,3,4]]
df = pd.DataFrame(data=d)
df
A
0 [5, 7]
1 [3, 4, 5]
2 [2]
3 [1, 2, 3, 4]
a = np.array(df['A'])
a
array([list([5, 7]), list([3, 4, 5]), list([2]), list([1, 2, 3, 4])],
dtype=object)
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(sparse = False)
X = enc.fit_transform(a)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-47-64181a9f7331> in <module>()
----> 1 X = enc.fit_transform(a)
~\Anaconda3\lib\site-packages\sklearn\preprocessing\data.py in fit_transform(self, X, y)
2017 """
2018 return _transform_selected(X, self._fit_transform,
-> 2019 self.categorical_features, copy=True)
2020
2021 def _transform(self, X):
~\Anaconda3\lib\site-packages\sklearn\preprocessing\data.py in _transform_selected(X, transform, selected, copy)
1807 X : array or sparse matrix, shape=(n_samples, n_features_new)
1808 """
-> 1809 X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)
1810
1811 if isinstance(selected, six.string_types) and selected == "all":
~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
431 force_all_finite)
432 else:
--> 433 array = np.array(array, dtype=dtype, order=order, copy=copy)
434
435 if ensure_2d:
ValueError: setting an array element with a sequence.
我使用的是 Windows 10、python 3.6.4、SciKit-Learn 0.19.1
非常感谢任何人的任何想法!
【问题讨论】:
你的预期输出是多少 【参考方案1】:对于列表项,您应该在sklearn
中使用MultiLabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
print (pd.DataFrame(mlb.fit_transform(df['A']),columns=mlb.classes_, index=df.index))
1 2 3 4 5 7
0 0 0 0 0 1 1
1 0 0 1 1 1 0
2 0 1 0 0 0 0
3 1 1 1 1 0 0
【讨论】:
感谢您的回答。我尝试了 mlb 解决方案,但我的实际数据集有 100 万个示例,并且出现内存错误,所以我想寻找其他解决方案。另外,我确实想知道我在 OneHotEncoder 上做错了什么。 @Michael 然后逐块尝试完成该过程 你能给我一个代码示例来实现这个吗? @Michael 类似***.com/questions/33542977/…以上是关于如何在 pandas 系列列表中使用 OneHotEncoder?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 dtype 为列表的 Pandas 系列中删除 NaN?
如果 pandas 系列的值是一个列表,如何获取每个元素的子列表?
如何检查变量是 python 列表、numpy 数组还是 pandas 系列