我有一个这样的熊猫数据框:
Text start end entity value
I love apple 7 11 fruit apple
I ate potato 6 11 vegetable potato
我尝试使用for循环 它运行缓慢,我不认为这是我们应该对熊猫做的事情。
我想基于此创建另一个熊猫数据框:
Sentence# Word Tag
1 I Object
1 love Object
1 apple fruit
2 I Object
2 ate Object
2 potato vegetable
将文本列拆分为单词和句子编号。除了实体词,其他词将被标记为对象。
答案 0 :(得分:3)
使用split
,stack
和map
:
u = df.Text.str.split(expand=True).stack()
pd.DataFrame({
'Sentence': u.index.get_level_values(0) + 1,
'Word': u.values,
'Entity': u.map(dict(zip(df.value, df.entity))).fillna('Object').values
})
Sentence Word Entity
0 1 I Object
1 1 love Object
2 1 apple fruit
3 2 I Object
4 2 ate Object
5 2 potato vegetable
旁注:如果运行v0.24或更高版本,请please use .to_numpy()
instead of .values
。
答案 1 :(得分:2)
我在str.split
之后使用unnesting
df.Text=df.Text.str.split(' ')
yourdf=unnesting(df,['Text'])
yourdf.loc[yourdf.Text.values!=yourdf.value.values,'entity']='object'
yourdf
Text start end entity value
0 I 7 11 object apple
0 love 7 11 object apple
0 apple 7 11 fruit apple
1 I 6 11 object potato
1 ate 6 11 object potato
1 potato 6 11 vegetable potato
答案 2 :(得分:2)
使用expand
函数I posted in this thread,您可以
df = expand(df, 'Text', sep=' ')
然后简单
df['Tag'] = np.where(df.Text.ne(df.value), ['Object'], df.entity)
>>> df[['Text', 'Tag']]
Text Tag
0 I Object
1 love Object
2 apple fruit
3 I Object
4 ate Object
5 potato vegetable
def expand(df, col, sep=','):
r = df[col].str.split(sep)
d = {c: df[c].values.repeat(r.str.len(), axis=0) for c in df.columns}
d[col] = [i for sub in r for i in sub]
return pd.DataFrame(d)