Python 当csv中使用pandas满足条件时,需要删除行并更新其他行

Python 当csv中使用pandas满足条件时,需要删除行并更新其他行,python,pandas,csv,delete-row,Python,Pandas,Csv,Delete Row,我对python相当陌生。我正在使用包含以下内容的csv文件 Name, Description, Price Comp1, comp desc, 60 Comp1, comp desc, 100 Comp1, comp desc, 250 Comp1, comp desc, 90 Comp1, comp desc, 125 Comp1, comp desc, 600 Comp1, comp desc, 395 我正在尝试读取文件,如果有任何重复项(基于名称),请删除这些重复项。如果价格50

我对python相当陌生。我正在使用包含以下内容的csv文件

Name, Description, Price
Comp1, comp desc, 60
Comp1, comp desc, 100
Comp1, comp desc, 250
Comp1, comp desc, 90
Comp1, comp desc, 125
Comp1, comp desc, 600
Comp1, comp desc, 395

我正在尝试读取文件,如果有任何重复项(基于名称),请删除这些重复项。如果价格<50,则删除这些。然后添加一个名为“Quality”的新列。如果价格<80,则将该行的“质量”设置为“平均”,如果价格<125,则将价格设置为“高”

我正在尝试使用Pandas来实现这一点(我尝试使用csv模块,但3天后无法找到它…)

到目前为止,我能够添加一个新列。我不知道如果行满足条件,如何删除它(令人惊讶的是,我在帖子中找不到任何符合我标准的内容)

我尝试了以下方法,但我得到一个错误,即“序列的真值是模糊的

代码:

#python 3.6
作为pd进口熊猫
csv\u input=pd.read\u csv(“d:\python programs\chairs.csv”)
csv_输入[“质量”]=“”
csv_input.loc[csv_input[“价格”]>50和csv_input[“价格”]<125,“质量”]=“平均”
csv_input.loc[csv_input[“价格”]>125,“质量”=“高”]
csv\u input.to\u csv(“d:\python programs\output2.csv”,index=False)
打印(csv_input.iloc[:,2])
最后一行只是一个检查,我正在与任何帮助是感谢工作

谢谢

更新: 我能够更新代码,让它做一些我想要的事情,但是我仍然需要了解如何删除price>=50的行(示例)

以下是更新的代码:

    import pandas as pd

    csv_input = pd.read_csv("d:\python programs\chairs.csv")
    csv_input["Quality"] = ""

    'This line set the Quality to average if the value is ,= 125'

    csv_input.loc[csv_input["Price"] <= 125, "Quality"] = "Average" 

    'This line sets the Quality to high if the Price is above 125'

    csv_input.loc[csv_input["Price"] > 125, "Quality"] = "High"

    'This line writes to an output file'

    csv_input.to_csv("d:\python programs\output2.csv", index=False)



    print (csv_input.iloc[:, 2])
将熊猫作为pd导入
csv\u input=pd.read\u csv(“d:\python programs\chairs.csv”)
csv_输入[“质量”]=“”
'如果值为,=125,则此行将质量设置为平均值'
csv_input.loc[csv_input[“价格”]125,“质量”]=“高”
'此行写入输出文件'
csv\u input.to\u csv(“d:\python programs\output2.csv”,index=False)
打印(csv_input.iloc[:,2])

再次感谢所有的评论和帮助。非常感谢。

您可以通过执行

csv_input = csv_input.loc[csv_input['Price'] > 50]

在索引中使用
&
运算符,而不是
,如果条件被某个逻辑运算符分隔,还可以将其括在括号中:

将熊猫作为pd导入
csv\u input=pd.read\u csv(“d:\python programs\chairs.csv”)
csv_输入[“质量”]=“”
csv_input.loc[(csv_input[“价格”]>50)和(csv_input[“价格”]<125),“质量”]=“平均”
#在下一个字符串中,“[”刚刚移动到正确的位置
csv_input.loc[csv_input[“价格”]>125,“质量”]=“高”
csv_输入
输出:
名称说明价格质量
0组件1组件描述60平均值
1比较1比较说明100平均值
2组件1组件描述250高
3 Comp1 comp desc 90平均值
4组件1组件描述125
5组件1组件描述600高
6组件1组件描述395高
说明:
csv_input[“Price”]<125
返回以下带有布尔值的pd.序列:

0 True
1正确
2错误
3正确
4错误
5错误
6错误
在python中,
kwd不能重载,但是
&
或其他(按位)逻辑运算符可以重载。 因此,
(csv_输入[“价格”]>50)和(csv_输入[“价格”]<125)
再次返回pd.Series(有关索引的更多信息):

0 True
1正确
2错误
3正确
4错误
5错误
6错误
此系列将用作
.loc[]
的布尔掩码(看起来与前一系列相同,因为
(csv_输入[“价格”]>50)
all
True


如果要删除重复的行,请先尝试重新创建DF

import pandas as pd
import numpy as np

# Create DF
csv_input = pd.DataFrame({'Name': ['Comp1', 'Comp2', 'Comp3', 'Comp1', 'Comp2', 'Comp3', 'Comp1', 'Comp2', 'Comp3'],
                          'Description': ['comp desc', 'comp desc', 'comp desc', 'comp desc', 'comp desc', 'comp desc', 'comp desc', 'comp desc', 'comp desc'],
                          'Price': [60, 30, 180, 100, 150, 160, 170, 200, 80]})
下面是您需要的代码

# Read File
csv_input = pd.read_csv("d:\python programs\chairs.csv")

# Remove duplicates
csv_input = csv_input.drop_duplicates(subset=['Name'])

# Remove records with price under 50
csv_input =  csv_input[csv_input['Price'] >= 50]

# Create Quality Column
csv_input["Quality"] = np.where(csv_input['Price']>125, 'High', 'Average')

# Save to CSV    
csv_input.to_csv("d:\python programs\output2.csv", index=False)

使用
&
而不是
您需要将.loc调用的结果分配给一个变量。更新:好的,在使用它和读取时,是的,我需要使用&而不是和…但是我仍然得到以下错误:(base)d:\python程序>python Pd_Add_Col_5.py回溯(最后一次调用):文件“Pd_Add_Col_5.py”,第7行,在csv_input.loc[csv_input[“Price”]>50和csv_input[“Price”]<125,“Quality”]=“Average”File“D:\Miniconda3\lib\site packages\pandas\core\generic.py”,第1576行,非零格式(self.\uu class\uuuuuuuuuuu名称\uuuuuuuu))值错误:序列的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.all()。我确实通过执行以下操作成功地让它完成了我想要的一些任务。将熊猫作为pd csv_input=pd导入。read_csv(“d:\python programs\chairs.csv”)csv_input[“Quality”]=“”’如果值为,=125'csv_input.loc[csv_input[“Price”]125,“Quality”]=“High”,则此行将质量设置为平均值'此行写入输出文件'csv\u input.to\u csv(“d:\python programs\output2.csv”,index=False)打印(csv\u input.iloc[:,2])如何删除价格为的行谢谢,这很有效,我喜欢使用numpy.where命令一次性创建质量列并设置值。我以前用两行来完成这项工作,并考虑使用if语句…我更喜欢这个…还感谢您发表评论,很多回复都不包括它们。additiona我的问题是,这是可行的,但是当我查看我在脚本中实际下载的文件(使用请求库)时,我注意到价格有一个前导$和尾随.00(price=$299.00),正如预期的那样,这显示了一个错误(str和int之间的TypeError)。那么,将价格包装为int最有效的方法是什么呢(或者应该是浮点?@PythonNewb最好的方法是将其作为字符串读取。然后删除前导$,例如使用下一个代码df['Price']=df['Price'].str[1:]。然后使用下一个代码df['Price']=df['Price']将其转换为int。astype('int64')
# Read File
csv_input = pd.read_csv("d:\python programs\chairs.csv")

# Remove duplicates
csv_input = csv_input.drop_duplicates(subset=['Name'])

# Remove records with price under 50
csv_input =  csv_input[csv_input['Price'] >= 50]

# Create Quality Column
csv_input["Quality"] = np.where(csv_input['Price']>125, 'High', 'Average')

# Save to CSV    
csv_input.to_csv("d:\python programs\output2.csv", index=False)