我对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,则将其删除。然后添加一个名为“质量”的新列。然后,如果价格<80,则将该行的质量设置为“平均”;如果价格<125,则将价格设置为“高”。
我正在尝试为此使用Pandas(我尝试使用csv模块,但三天后仍无法解决...)
到目前为止,我已经可以添加一个新列。我不确定如何删除符合条件的行(令人惊讶的是,我在帖子中找不到符合我的条件的任何内容)
我尝试了以下操作,但收到一条错误消息:“系列的真值不明确...
代码:
#python 3.6
import pandas as pd
csv_input = pd.read_csv("d:\python programs\chairs.csv")
csv_input["Quality"] = ""
csv_input.loc[csv_input["Price"] > 50 and csv_input["Price"] < 125, "Quality"] = "Average"
csv_input.loc[csv_input["Price"] > 125, "Quality" = "High"]
csv_input.to_csv("d:\python programs\output2.csv", index=False)
print (csv_input.iloc[:, 2])
最后一行只是对我正在提供任何帮助的检查。
谢谢
更新: 我能够更新代码以使其执行我想要的某些操作,但是我仍然需要了解如何删除价格> = 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])
再次感谢所有评论和帮助。我很感激。
答案 0 :(得分:1)
在索引中使用&
而不是and
运算符,如果条件被某些逻辑运算符分隔,也将其括在括号中:
import pandas as pd
csv_input = pd.read_csv("d:\python programs\chairs.csv")
csv_input["Quality"] = ""
csv_input.loc[(csv_input["Price"] > 50) & (csv_input["Price"] < 125), "Quality"] = "Average"
# in the next string '[' just moved to the right place
csv_input.loc[csv_input["Price"] > 125, "Quality"] = "High"
csv_input
Out:
Name Description Price Quality
0 Comp1 comp desc 60 Average
1 Comp1 comp desc 100 Average
2 Comp1 comp desc 250 High
3 Comp1 comp desc 90 Average
4 Comp1 comp desc 125
5 Comp1 comp desc 600 High
6 Comp1 comp desc 395 High
说明:
csv_input["Price"] < 125
返回以下具有布尔值的pd.Series:
0 True
1 True
2 False
3 True
4 False
5 False
6 False
在python中,and
kwd无法重载,但是&
或其他(按位)逻辑运算符可以重载。
因此,(csv_input["Price"] > 50) & (csv_input["Price"] < 125)
再次返回pd.Series(有关索引的更多信息):
0 True
1 True
2 False
3 True
4 False
5 False
6 False
该系列将用作.loc[]
的布尔掩码。 (之所以与前一个系列相同,是因为(csv_input["Price"] > 50)
全部True
)
如果您要删除重复的行,请尝试pd.DataFrame.drop_duplicates().
答案 1 :(得分:0)
您可以这样做删除行,
csv_input = csv_input.loc[csv_input['Price'] > 50]
答案 2 :(得分:0)
首先让我们重新创建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)