将包含熊猫系列的列转换为特征[重复]
Posted
技术标签:
【中文标题】将包含熊猫系列的列转换为特征[重复]【英文标题】:Convert a column which contains pandas Series to features [duplicate] 【发布时间】:2020-06-16 19:09:34 【问题描述】:我的数据框如下:
a
0 [8, 10]
1 [12, 7, 9]
如您所见,a 列包含一个列表。该列表中的数字在我们的领域中具有意义,我想将它们用作特征。我的预期输出如下:
Tag_7 Tag_8 Tag_9 Tag_10 Tag_12
0 0 1 0 1 0
1 1 0 1 0 1
我使用了一些从互联网上找到的方法,它们满足了我的期望,但这些方法存在执行时间问题。其中之一如下:
pd.get_dummies(df.a.apply(pd.Series).stack().astype(int), prefix='Tag').sum(level=0)
我认为这种方法对于小型数据集很有用。就我而言,它没有用。我需要帮助。 提前致谢。祝你有美好的一天
【问题讨论】:
也许pd.Series(['|'.join(map(str, x)) for x in df['a']]).str.get_dummies().add_prefix('Tag_')
【参考方案1】:
有点hacking,但你可以这样做:
df['bitsum'] = df['input'].apply(lambda lst: sum(1 << x for x in lst))
pd.Series(np.array(list(map(lambda x: f'x:b', df['bitsum'])))).apply(lambda x: x[::-1]).str.split('')
不确定它是否工作得更快。如果你知道你有多少功能,你可以用 1 << (n_max - x)
替换 1 << x
等等 a) 摆脱字符串反转 apply(lambda x: x[::-1])
,b) 使用 bin
而不是 lambda x: f'x:b'
,这似乎也更快.
【讨论】:
【参考方案2】:试试scikit-learn
看看有没有帮助
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
cols = np.unique(np.concatenate(df.a))
df_final = pd.DataFrame(mlb.fit_transform(df.a), columns=cols).add_prefix('T_')
Out[213]:
T_7 T_8 T_9 T_10 T_12
0 0 1 0 1 0
1 1 0 1 0 1
如果您需要挤压每个ms
,使用chain.from_iterable
比np.concatenate
快,并使用np.char.add
到T_
到列名
from sklearn.preprocessing import MultiLabelBinarizer
from itertools import chain
mlb = MultiLabelBinarizer()
cols = np.char.add('T_', np.unique(list(chain.from_iterable(df.a))).astype(str))
df_final = pd.DataFrame(mlb.fit_transform(df.a), columns=cols)
【讨论】:
感谢您的回答。 ***.com/a/45313942/8839111 我觉得这个解决方案好一点。以上是关于将包含熊猫系列的列转换为特征[重复]的主要内容,如果未能解决你的问题,请参考以下文章