wae*_*ski 2 python string nlp dataframe pandas
我在使用大型 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
... ...
Run Code Online (Sandbox Code Playgroud)
这是我想要的
>df2
sent nounverb adj
bike winner bike winner None
red car is fast car is red fast
...
Run Code Online (Sandbox Code Playgroud)
我一直无法为此找到解决方案,而且由于我是 Python 的初学者,我无法想出一个for loop可以为我做到这一点的解决方案。
编辑:
感谢 Andy & Jesús 的快速解答。安迪的回答工作得很好,尽管在创建新的 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)))
})
Run Code Online (Sandbox Code Playgroud)
如果为 is "nounverb" 添加虚拟列,则可以使用普通的 ol' groupby:
In [11]: df["is_nounverb"] = (df.tag == "NOUN") | (df.tag == "VERB")
Run Code Online (Sandbox Code Playgroud)
然后你可以计算!你所看到的枚举句子:
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
Run Code Online (Sandbox Code Playgroud)
然后分组:
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
Run Code Online (Sandbox Code Playgroud)
并一起:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |