使用pandas删除不包含特定字符串的行

4
我希望使用Python的pandas库来删除电子表格中在"Equipment"列中不包含"CAT"的行。 以下是我目前的代码:
import pandas as pd
import openpyxl
import warnings
import xlrd

warnings.filterwarnings("ignore")

file_name = input("Enter File Name: ")
df = pd.read_csv(file_name)


for i in range(len(df["Equipment"])):
    if "CAT" in df["Equipment"][i]:
        print (df["Equipment"][i])
    else:
        df.drop([i])

df.to_excel("new_mp.xlsx")

脚本在终端中打印出正确的值,但不会将行删除到新的电子表格“new_mp.xlsx”中。有人能指点我正确的方向吗?
示例数据:
Equipment
CAT 259B3 1818 OE Skid Steer 2011 CAT
T-14 Towmaster Trailer 3124 OE Trailer 2008
CAT 938M Loader RPO RENTAL 2017 CAT 938M
Rental Water Truck 55571 Rental Water Truck international water truck
2个回答

8

在这里您不需要循环,可以使用str.contains来实现:

v = df[df["Equipment"].str.contains('CAT')]
print(v)
                                  Equipment
0     CAT 259B3 1818 OE Skid Steer 2011 CAT
2  CAT 938M Loader RPO RENTAL 2017 CAT 938M

或者,使用 engine='python'query
v = df.query('Equipment.str.contains("CAT")', engine='python')
print(v)
                                  Equipment
0     CAT 259B3 1818 OE Skid Steer 2011 CAT
2  CAT 938M Loader RPO RENTAL 2017 CAT 938M

最后,写入磁盘:

v.to_excel("new_mp.xlsx")

2
您可以使用此功能来筛选行。
df[df['Equipment'].apply(lambda x: 'CAT' in x)].to_excel("new_mp.xlsx")

编辑:

好的,让我逐一解释这个问题:

lambda x: 'CAT' in x 输入参数x,如果x中包含'CAT',则返回True。

现在,df['Equipment'].apply 方法将在系列的每个值上调用上述的 lambda 函数。结果将是一个布尔数组,然后作为布尔掩码传递给 df

希望我没有过头了。


我不相信这个解决方案考虑到了当单元格值中包含“'CAT'”时的情况,即它只考虑整个单元格值等于“'CAT'”时的情况。你能修改你的答案吗? - jeschwar
是的,我错过了包含部分。我已经更新了答案。 - Omkar Sabade
这个有效!您介意给我一个简要的解释吗?因为我正在尝试学习更多并将其用于其他项目。 - cbennett423

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接