繁体   English   中英

在熊猫DF的单元格中查找唯一元素,并将DF扩展为包含具有这些唯一元素名称的列

[英]Finding unique elements in cells of pandas DF and expanding DF to include columns with the names of those unique elements

我有一个看起来像这样的DF:

在此处输入图片说明

我想以某种矢量化形式创建一个新的DF,例如instrumentsDF,这样我会得到以下信息:

0       Piano  Guitar Viola
0       0      0      1
1       0      1      0
2       1      0      1
3       0      1      0
4       1      1      1

我不知道单元格中有多少个唯一的favored_instruments,这意味着我不知道新DF中将有多少列。

到目前为止,我的代码是这样,但无法考虑如何扩展它以输出我需要的内容:

crunk = lambda x: pd.Series([i for i in reversed(x.split(','))])
vector = compDf['favored_instrument'].apply(crunk)
print vector

产生此:

        0          1       2
0       Piano      NaN     NaN
1       Piano      NaN     NaN
2       Piano      NaN     NaN
3       Guitar     Piano   NaN
4       Piano      NaN     NaN

我可以尝试遍历DF的每一行,用','分割值,然后添加到python列表中,但是这种方法可能很慢。 有没有更好的办法?

熊猫具有get_dummies函数:

>>> import pandas as pd
>>> data = pd.DataFrame({'instrument': ['Piano', 'Piano', 'Guitar', 'Viola', 'Viola', 'Guitar']})

>>> pd.get_dummies(data['instrument'])
   instrument_Guitar  instrument_Piano  instrument_Viola
0                  0                 1                 0
1                  0                 1                 0
2                  1                 0                 0
3                  0                 0                 1
4                  0                 0                 1
5                  1                 0                 0

我认为对性能的担心是次要的。 首先,通过利用expand=True.str.split来使您称为vector的数据帧:

>>> df
    favoured_instrument
0                 Piano
1                 Viola
2          Viola, Piano
3                Guitar
4  Piano, Guitar, Viola
>>> d2 = df["favoured_instrument"].str.split("\s*,\s*", expand=True)
>>> d2
        0       1      2
0   Piano    None   None
1   Viola    None   None
2   Viola   Piano   None
3  Guitar    None   None
4   Piano  Guitar  Viola

然后我们可以通过多种方式来实现这一点。 使用get_dummies ,例如:

>>> pd.get_dummies(d2.stack()).groupby(level=0).sum()
   Guitar  Piano  Viola
0       0      1      0
1       0      0      1
2       0      1      1
3       1      0      0
4       1      1      1

sklearn.preprocessing.LabelBinarizer可能非常有用

简要示例:

from sklearn import preprocessing
lb= preprocessing.LabelBinarizer()
lb.fit_transform(['Piano', 'Piano', 'Guitar', 'Viola', 'Viola', 'Guitar'])

结果:

array([[0, 1, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 1],
       [0, 0, 1],
       [1, 0, 0]])

lb.classes_列名

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM