我有函数get_tags
,该函数返回与文本相对应的标签列表:
def get_tags(text):
# Do some analysis and return a list of tags
return tags
例如,get_tags(text1)
返回['a', 'b', 'c']
,而get_tags(text2)
返回['a', 'b']
我还有一个熊猫DataFrame df
,其中列[text, a, b, c, d, e, f]
具有500,000行。我想将1填充为特定行中文本的标签。现在,我正在执行
for i in range(len(df)):
df.loc[i, get_tags(df.loc[i, "text"])] = 1
这太慢了。我可以使用joblib
,但在此之前,我想了解实现这一目标的最有效方法。
在执行之前,df
如下所示:
text a b c d e f
0 text having a, b, c tags 0 0 0 0 0 0
1 text having a, c tags 0 0 0 0 0 0
2 text having a, b, f tags 0 0 0 0 0 0
执行后,它应如下所示:
text a b c d e f
0 text having a, b, c tags 1 1 1 0 0 0
1 text having a, c tags 1 0 1 0 0 0
2 text having a, b, f tags 1 1 0 0 0 1
答案 0 :(得分:1)
df是您的原始数据帧,
我们还可以在sklearn.preprocessing中使用MultiLabelBinarizer。
执行前,df为:
--------------------------
| | text | labels |
--------------------------
| 0 | A | a, b, c |
--------------------------
| 1 | B | a, c |
--------------------------
| 2 | C | a, b, f |
--------------------------
执行以下操作:
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
mlb_result = mlb.fit_transform([str(df.loc[i,'labels']).split(',') for i in range(len(df))])
df_final = pd.concat([df['text'],pd.DataFrame(mlb_result,columns=list(mlb.classes_))],axis=1)
执行后,df_final为:
------------------------------------
| | text | a | b | c | d | e | f |
------------------------------------
| 0 | A | 1 | 1 | 1 | 0 | 0 | 0 |
------------------------------------
| 1 | B | 1 | 0 | 1 | 0 | 0 | 0 |
------------------------------------
| 2 | C | 1 | 1 | 0 | 0 | 0 | 1 |
------------------------------------
df_final将是您想要的。
答案 1 :(得分:0)
我不确定这是否可以加快速度,但是否可以正常工作
for i in ['a','b','c','d','e','f']:
df[i] = [(1 if i in element else 0) for element in df['text'].apply(get_tags)]