删除 Python 中符合特定条件的行
Delete rows with certain conditions in Python
我正在研究 Twitter 消息的某个关键字,使用 Twitter 搜索 API Python。
现在我有一个很大的 CSV 文件,其中包含包含此关键字的消息,但用户名中也包含该关键字。所以这些消息与关键字无关,关键字恰好在用户名中。
示例:
我的 csv 中的正确行:
@Koningsbruggen 发推文:@CGCommunicatie 你们在 "KEYWORD" 吗?
我的 csv 中有一行不正确:
@"KEYWORD"_lady 发推文:@rvanbommel 是的没关系
如何使用 Python 代码删除后一行?
我有一个 120K 行的 csv,所以自动删除这些不正确的行会很好。
如果您将推文加载到 pandas 数据框中,则可以非常轻松快速地对其进行过滤:
In [11]:
df = pd.DataFrame({'tweet':['@Koningsbruggen tweeted: @CGCommunicatie are you guys in "KEYWORD"?', '@"KEYWORD"_lady tweeted: @rvanbommel yes thats okay']})
df
Out[11]:
tweet
0 @Koningsbruggen tweeted: @CGCommunicatie are y...
1 @"KEYWORD"_lady tweeted: @rvanbommel yes thats...
我们可以调用矢量化 str
方法来 split
推文并使用 contains
:
过滤它们
In [25]:
df[df.tweet.str.split('tweeted:').str[1].str.contains('KEYWORD')]
Out[25]:
tweet
0 @Koningsbruggen tweeted: @CGCommunicatie are y...
加载数据到pandas的方法有很多:http://pandas.pydata.org/pandas-docs/stable/io.html
如果您的输入文件是逐行列出的消息:
ATamsterdam_lady tweeted: ATrvanbommel ja dikke vlokken
ATKoningsbruggen tweeted: ATCGCommunicatie zitten jullie in Amsterdam?
ATJustoRasta tweeted: febovers ... AT Leidseplein - Amsterdam Centrum t.co/KCUCzj2dWq
AT7Ash_bash tweeted: #HENNY AND AMSTERDAM TONIGHT
然后您可以使用以下 Python 代码:
input_file = 'twitter.txt'
output_file = 'result.txt'
keyword = 'Amsterdam'
with open(input_file) as f:
lines = f.readlines()
for line in lines:
message = line.split('tweeted: ')[1]
if keyword.lower() in message.lower():
with open(output_file, 'a') as myfile:
myfile.write(line)
生成的输出文件包含逐行文本,仅在 'message' 部分包含 'Amsterdam':
ATKoningsbruggen tweeted: ATCGCommunicatie zitten jullie in Amsterdam?
ATJustoRasta tweeted: febovers ... AT Leidseplein - Amsterdam Centrum t.co/KCUCzj2dWq
AT7Ash_bash tweeted: #HENNY AND AMSTERDAM TONIGHT
我正在研究 Twitter 消息的某个关键字,使用 Twitter 搜索 API Python。
现在我有一个很大的 CSV 文件,其中包含包含此关键字的消息,但用户名中也包含该关键字。所以这些消息与关键字无关,关键字恰好在用户名中。
示例:
我的 csv 中的正确行: @Koningsbruggen 发推文:@CGCommunicatie 你们在 "KEYWORD" 吗?
我的 csv 中有一行不正确: @"KEYWORD"_lady 发推文:@rvanbommel 是的没关系
如何使用 Python 代码删除后一行? 我有一个 120K 行的 csv,所以自动删除这些不正确的行会很好。
如果您将推文加载到 pandas 数据框中,则可以非常轻松快速地对其进行过滤:
In [11]:
df = pd.DataFrame({'tweet':['@Koningsbruggen tweeted: @CGCommunicatie are you guys in "KEYWORD"?', '@"KEYWORD"_lady tweeted: @rvanbommel yes thats okay']})
df
Out[11]:
tweet
0 @Koningsbruggen tweeted: @CGCommunicatie are y...
1 @"KEYWORD"_lady tweeted: @rvanbommel yes thats...
我们可以调用矢量化 str
方法来 split
推文并使用 contains
:
In [25]:
df[df.tweet.str.split('tweeted:').str[1].str.contains('KEYWORD')]
Out[25]:
tweet
0 @Koningsbruggen tweeted: @CGCommunicatie are y...
加载数据到pandas的方法有很多:http://pandas.pydata.org/pandas-docs/stable/io.html
如果您的输入文件是逐行列出的消息:
ATamsterdam_lady tweeted: ATrvanbommel ja dikke vlokken
ATKoningsbruggen tweeted: ATCGCommunicatie zitten jullie in Amsterdam?
ATJustoRasta tweeted: febovers ... AT Leidseplein - Amsterdam Centrum t.co/KCUCzj2dWq
AT7Ash_bash tweeted: #HENNY AND AMSTERDAM TONIGHT
然后您可以使用以下 Python 代码:
input_file = 'twitter.txt'
output_file = 'result.txt'
keyword = 'Amsterdam'
with open(input_file) as f:
lines = f.readlines()
for line in lines:
message = line.split('tweeted: ')[1]
if keyword.lower() in message.lower():
with open(output_file, 'a') as myfile:
myfile.write(line)
生成的输出文件包含逐行文本,仅在 'message' 部分包含 'Amsterdam':
ATKoningsbruggen tweeted: ATCGCommunicatie zitten jullie in Amsterdam?
ATJustoRasta tweeted: febovers ... AT Leidseplein - Amsterdam Centrum t.co/KCUCzj2dWq
AT7Ash_bash tweeted: #HENNY AND AMSTERDAM TONIGHT