在pandas DF的单元格中查找唯一元素并扩展DF以包含具有这些唯一元素名称的列

时间:2015-12-05 16:53:49

标签: python pandas split

我的DF看起来像这样:

enter image description here

我想以某种矢量化的形式创建一个新的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列表,但这种方法可能很慢。有没有更好的办法?

3 个答案:

答案 0 :(得分:1)

Pandas拥有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

答案 1 :(得分:1)

我认为对性能的担忧是次要的。首先,利用vector.str.split一起制作您调用expand=True的数据帧:

>>> 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

答案 2 :(得分:0)

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_ - 列名称