pandas:如何从深度嵌套的列表列表中删除重复项
pandas: how to remove duplicates from a deeply nested list of lists
我有一个如下所示的熊猫数据框:
df = pd.DataFrame({ 'text':['the weather is nice though', 'How are you today','the beautiful girl and the nice boy']})
df['sentence_number'] = df.index + 1
df['token'] = df['text'].str.split().tolist()
df= df.explode('token').reset_index(drop=True)
我必须有一个令牌列,因为我需要它用于另一个项目。我已将以下内容应用于我的数据框。
import spacy
nlp = spacy.load("en_core_web_sm")
dep_children_sm = []
def dep_children_tagger(txt):
children = [[[child for child in n.children] for n in doc] for doc in nlp.pipe(txt)]
dep_children_sm.append(children)
dep_children_tagger(df.text)
由于必须在句子级别应用 n.children 方法,因此我必须使用文本列而不是标记列,因此输出具有重复列表。我现在想从我的列表中删除这些重复项 'dep_children_sm',我已经完成了以下操作,
children_flattened =[item for sublist in dep_children_sm for item in sublist]
list(k for k,_ in itertools.groupby(children_flattened))
但是没有任何反应,我仍然有重复的列表。我也尝试在调用函数时将 drop_duplicates() 添加到文本列,但问题是我的原始数据框中有重复的句子,不幸的是不能这样做。
desired output = [[[], [the], [weather, nice, though], [], []], [[], [How, you, today], [], []], [[], [], [the, beautiful, and, boy], [], [], [], [the, nice]]]
您似乎想将您的函数应用于唯一文本。因此,您可以先在 df.text
上使用 pandas.Series.unique 方法
>>> df['text'].unique()
array(['the weather is nice though', 'How are you today',
'the beautiful girl and the nice boy'], dtype=object)
那我把你的函数简化一下,直接输出结果。不需要全局列表。此外,您的函数正在添加一个额外的列表级别,这似乎是不需要的。
def dep_children_tagger(txt):
return [[[child for child in n.children] for n in doc] for doc in nlp.pipe(txt)]
最后,将您的函数应用于唯一文本:
dep_children_sm = dep_children_tagger(df['text'].unique())
这给出:
>>> dep_children_sm
[[[], [the], [weather, nice, though], [], []],
[[], [How, you, today], [], []],
[[], [], [the, beautiful, and, boy], [], [], [], [the, nice]]]
好的,我想出了解决这个问题的方法。问题是 nlp.text 在 spacy 标记上输出列表列表的列表,并且由于此嵌套列表中没有任何字符串,因此 itertools 不起作用。
由于我无法从分析中的文本列中删除重复项,因此我改为执行以下操作。
d =[' '.join([str(c) for c in lst]) for lst in children_flattened]
list(set(d))
这会输出一个不包括重复项的字符串列表
# ['[] [How, you, today] [] []',
# '[] [the] [weather, nice, though] [] []',
# '[] [] [the, beautiful, and, boy] [] [] [] [the, nice]']
我有一个如下所示的熊猫数据框:
df = pd.DataFrame({ 'text':['the weather is nice though', 'How are you today','the beautiful girl and the nice boy']})
df['sentence_number'] = df.index + 1
df['token'] = df['text'].str.split().tolist()
df= df.explode('token').reset_index(drop=True)
我必须有一个令牌列,因为我需要它用于另一个项目。我已将以下内容应用于我的数据框。
import spacy
nlp = spacy.load("en_core_web_sm")
dep_children_sm = []
def dep_children_tagger(txt):
children = [[[child for child in n.children] for n in doc] for doc in nlp.pipe(txt)]
dep_children_sm.append(children)
dep_children_tagger(df.text)
由于必须在句子级别应用 n.children 方法,因此我必须使用文本列而不是标记列,因此输出具有重复列表。我现在想从我的列表中删除这些重复项 'dep_children_sm',我已经完成了以下操作,
children_flattened =[item for sublist in dep_children_sm for item in sublist]
list(k for k,_ in itertools.groupby(children_flattened))
但是没有任何反应,我仍然有重复的列表。我也尝试在调用函数时将 drop_duplicates() 添加到文本列,但问题是我的原始数据框中有重复的句子,不幸的是不能这样做。
desired output = [[[], [the], [weather, nice, though], [], []], [[], [How, you, today], [], []], [[], [], [the, beautiful, and, boy], [], [], [], [the, nice]]]
您似乎想将您的函数应用于唯一文本。因此,您可以先在 df.text
上使用 pandas.Series.unique 方法>>> df['text'].unique()
array(['the weather is nice though', 'How are you today',
'the beautiful girl and the nice boy'], dtype=object)
那我把你的函数简化一下,直接输出结果。不需要全局列表。此外,您的函数正在添加一个额外的列表级别,这似乎是不需要的。
def dep_children_tagger(txt):
return [[[child for child in n.children] for n in doc] for doc in nlp.pipe(txt)]
最后,将您的函数应用于唯一文本:
dep_children_sm = dep_children_tagger(df['text'].unique())
这给出:
>>> dep_children_sm
[[[], [the], [weather, nice, though], [], []],
[[], [How, you, today], [], []],
[[], [], [the, beautiful, and, boy], [], [], [], [the, nice]]]
好的,我想出了解决这个问题的方法。问题是 nlp.text 在 spacy 标记上输出列表列表的列表,并且由于此嵌套列表中没有任何字符串,因此 itertools 不起作用。 由于我无法从分析中的文本列中删除重复项,因此我改为执行以下操作。
d =[' '.join([str(c) for c in lst]) for lst in children_flattened]
list(set(d))
这会输出一个不包括重复项的字符串列表
# ['[] [How, you, today] [] []',
# '[] [the] [weather, nice, though] [] []',
# '[] [] [the, beautiful, and, boy] [] [] [] [the, nice]']