我在使用大型Pandas DataFrame(1 500 000行)重建句子时遇到了问题。我的目标是将单词中的句子重建为一个新的数据帧,以便每行有一个句子。我的DataFrame中有两个系列:单词&标签。每个句子都用感叹号分隔。除此之外,我想使用原始DataFrame中的标签为形容词和名词/动词创建两个单独的系列到新的DataFrame中。所以这就是我所拥有的:
>df
word tag
bike NOUN
winner NOUN
! PUNCTUATION
red ADJECTIVE
car NOUN
is VERB
fast ADJECTIVE
! PUNCTUATION
... ...
这就是我想要的
>df2
sent nounverb adj
bike winner bike winner None
red car is fast car is red fast
...
我一直无法为此找到解决方案,因为我是Python的初学者,我无法想出一个能为我做这个的for loop
。
编辑:
谢谢Andy& Jesús快速回答。 Andy的回答工作得很好,虽然在创建新的DataFrame时我需要稍作修改。需要将这些单词称为字符串。
df2 = pd.DataFrame({
"sent": g.apply(lambda sdf: " ".join(sdf.word.astype(str))),
"nounverb": g.apply(lambda sdf: " ".join(sdf[sdf.is_nounverb].word.astype(str))),
"adj": g.apply(lambda sdf: " ".join(sdf[sdf.tag == "ADJECTIVE"].word.astype(str)))
})
答案 0 :(得分:4)
如果为is" nounverb"添加虚拟列。你可以使用普通的' GROUPBY:
In [11]: df["is_nounverb"] = (df.tag == "NOUN") | (df.tag == "VERB")
然后你可以算上你已经看到的!
枚举句子:
In [12]: df["sentence"] = (df.word == "!").cumsum()
In [13]: df = df[df.word != "!"]
In [14]: df
Out[14]:
word tag sentence is_nounverb
0 bike NOUN 0 True
1 winner NOUN 0 True
3 red ADJECTIVE 1 False
4 car NOUN 1 True
5 is VERB 1 True
6 fast ADJECTIVE 1 False
并分组:
In [15]: g = df.groupby("sentence")
In [16]: g.apply(lambda sdf: " ".join(sdf.word))
Out[16]:
sentence
0 bike winner
1 red car is fast
dtype: object
In [17]: g.apply(lambda sdf: " ".join(sdf[sdf.is_nounverb].word))
Out[17]:
sentence
0 bike winner
1 car is
dtype: object
In [18]: g.apply(lambda sdf: " ".join(sdf[sdf.tag == "ADJECTIVE"].word))
Out[18]:
sentence
0
1 red fast
dtype: object
一起:
In [21]: df2 = pd.DataFrame({
"sent": g.apply(lambda sdf: " ".join(sdf.word)),
"nounverb": g.apply(lambda sdf: " ".join(sdf[sdf.is_nounverb].word)),
"adj": g.apply(lambda sdf: " ".join(sdf[sdf.tag == "ADJECTIVE"].word))
})
In [22]: df2
Out[22]:
adj nounverb sent
sentence
0 bike winner bike winner
1 red fast car is red car is fast
答案 1 :(得分:0)
解决方案继续沿着数据框中的第一列运行并组合句子列表。例如,您可以使用循环条件来跳过标点符号。然后对于你要组装成句子的每个临时单词,你应该组装一个描述(假设你们两者之间有1:1的相关性)。
我提出了一个不完整功能的小例子,但它应该指向正确的方向。
a = ['bike', 'winner', '!', 'red', 'car', 'is', 'fast', '!']
b = ['noun', 'noun', 'punctuation', 'adjective', 'noun', 'verb', 'adjective', 'punctuation']
temp_word = ''
temp_nounverb = ''
temp_adjective = ''
for index,word in enumerate(a):
if word is not '!':
temp_word += word + ' '
if b[index] is 'noun' or b[index] is 'verb':
temp_nounverb += word + ' '
temp_adjective += 'None'
else:
temp_nounverb += 'None'
temp_adjective += word + ' '
else:
print(temp_word + ' - ' + temp_nounverb + ' - ' + temp_adjective)
temp_word = ''
temp_nounverb = ''
temp_adjective = ''
如果您需要进一步的指示,请告诉我,我很乐意提供帮助。