Pandas:如何准备多标签数据集?

5

我有一个函数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'] 我还有一个 pandas DataFrame df,它有 500,000 行和列 [text, a, b, c, d, e, f]。我想将 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


你可以使用 df['label'] = df['text'].apply(lambda x: get_tags(x)),然后从 label 列中将标签拆分到相应的列中。 - Sociopath
请展示数据样本。 - Upasana Mittal
有时候,在 Pandas 之外进行计算,然后将数据放回数据框中会更快。但在你的情况下,get_tags 也可能成为瓶颈。 - dennis-w
2个回答

3

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将是您想要的内容。


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

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