使用熊猫在csv中满足条件时需要删除行并更新其他行

时间:2018-08-20 16:58:41

标签: 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,则将其删除。然后添加一个名为“质量”的新列。然后,如果价格<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])

再次感谢所有评论和帮助。我很感激。

3 个答案:

答案 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)