如何对值为字符串列表的列进行独热编码?

6

我基本上是想对一个具有以下值的列进行独热编码:

  tickers
1 [DIS]
2 [AAPL,AMZN,BABA,BAY]
3 [MCDO,PEP]
4 [ABT,ADBE,AMGN,CVS]
5 [ABT,CVS,DIS,ECL,EMR,FAST,GE,GOOGL]
...

首先,我获得了所有票据的集合(约467个票据):

all_tickers = list()
for tickers in df.tickers:
    for ticker in tickers:
        all_tickers.append(ticker)
all_tickers = set(all_tickers)

然后我这样实现了One Hot Encoding:

for i in range(len(df.index)):
    for ticker in all_tickers:
        if ticker in df.iloc[i]['tickers']:
            df.at[i+1, ticker] = 1
        else:
            df.at[i+1, ticker] = 0

问题在于脚本处理5000多行数据时运行非常缓慢。 如何改进我的算法呢?

2个回答

14

我认为你需要使用str.joinstr.get_dummies

df = df['tickers'].str.join('|').str.get_dummies()
from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()

df = pd.DataFrame(mlb.fit_transform(df['tickers']),columns=mlb.classes_, index=df.index)
print (df)
   AAPL  ABT  ADBE  AMGN  AMZN  BABA  BAY  CVS  DIS  ECL  EMR  FAST  GE  \
1     0    0     0     0     0     0    0    0    1    0    0     0   0   
2     1    0     0     0     1     1    1    0    0    0    0     0   0   
3     0    0     0     0     0     0    0    0    0    0    0     0   0   
4     0    1     1     1     0     0    0    1    0    0    0     0   0   
5     0    1     0     0     0     0    0    1    1    1    1     1   1   

   GOOGL  MCDO  PEP  
1      0     0    0  
2      0     0    0  
3      0     1    1  
4      0     0    0  
5      1     0    0  

它运行了!而且比我的代码快得多!谢谢jezrael! - Castle

3
您可以使用 apply(pd.Series) 然后再使用 get_dummies()
df = pd.DataFrame({"tickers":[["DIS"], ["AAPL","AMZN","BABA","BAY"], 
                              ["MCDO","PEP"], ["ABT","ADBE","AMGN","CVS"], 
                              ["ABT","CVS","DIS","ECL","EMR","FAST","GE","GOOGL"]]})

pd.get_dummies(df.tickers.apply(pd.Series), prefix="", prefix_sep="")

   AAPL  ABT  DIS  MCDO  ADBE  AMZN  CVS  PEP  AMGN  BABA  DIS  BAY  CVS  ECL  \
0     0    0    1     0     0     0    0    0     0     0    0    0    0    0   
1     1    0    0     0     0     1    0    0     0     1    0    1    0    0   
2     0    0    0     1     0     0    0    1     0     0    0    0    0    0   
3     0    1    0     0     1     0    0    0     1     0    0    0    1    0   
4     0    1    0     0     0     0    1    0     0     0    1    0    0    1   

   EMR  FAST  GE  GOOGL  
0    0     0   0      0  
1    0     0   0      0  
2    0     0   0      0  
3    0     0   0      0  
4    1     1   1      1  

如果列表中的值在列表中的不同位置,则此方法无法正常工作。例如,对于数据框 pd.DataFrame({"col":[["A","B"], ["B","A"]]}) 或仅 pd.DataFrame({"col":[["A","B"], ["B"]]}),此方法都会失败。 - coderforlife
由于某种原因,此解决方案会创建列的副本。 - Sayyor Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接