【问题标题】:Change value(s) in a pandas DataFrame which were selected from multiple column values更改从多个列值中选择的 pandas DataFrame 中的值
【发布时间】:2016-12-31 06:00:16
【问题描述】:

第一次发帖,请原谅我问这个问题的方式不圆滑。

我正在解决一个问题,在找到符合特定条件的行后,我无法更改 DataFrame 的值。

data = pd.read_csv('students.csv')

索引为:StudentId、Tuition、Scholarship、CreditScore、City、 高中

我只寻找高中 == 'x' 和 CreditScore == 'y' 的学生,然后将他们的奖学金浮动从 0.0 更改为 8.5。

请注意,有多个学生的奖学金数字为 0.0,我正在尝试仅更改 HighSchool=='x' 和 CreditScore=='y' 的学生的奖学金值。

我遇到的问题是,当我找到符合我的标准的行并尝试更改奖学金值时,pandas 只会更改似乎是 DataFrame 副本的值。我想更改 DataFrame 的值。

我试过了:

data[data[([Highschool]=='x') & ([CreditScore]=='y')]]['Scholarship'] = 8.5
data[data[([Highschool]=='x') & ([CreditScore]=='y')]]['Scholarship'].replace(0, 8.5, inplace=True)

但是,在检查 data[data[([Highschool]=='x') & ([CreditScore]=='y')]]['Scholarship'] 后,“奖学金”的选定结果仍然显示 0.0。

有什么更好的方法可以更改符合搜索条件的列的值?

谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用loc

    data.loc[(data['Highschool']=='x') & (data['CreditScore']=='y'), 'Scholarship'] = 8.5
    

    或者等价

    hs = data.Highschool == 'x'
    cs = data.CreditScore == 'y'
    data.loc[hs & cs, 'Scholarship'] = 8.5
    

    演示

    np.random.seed([3,1415])
    data = pd.DataFrame(dict(
            Highschool=np.random.choice(('x', 'y', 'z'), 20),
            CreditScore=np.random.choice(('y', 'n'), 20),
            Scholarship=np.zeros(20)
        ))
    
    data.loc[
        (data['Highschool']=='x') & 
        (data['CreditScore']=='y'),
        'Scholarship'] = 8.5
    
    print(data)
    
       CreditScore Highschool  Scholarship
    0            y          x          8.5
    1            n          z          0.0
    2            n          z          0.0
    3            n          z          0.0
    4            n          z          0.0
    5            y          y          0.0
    6            y          y          0.0
    7            y          z          0.0
    8            y          x          8.5
    9            y          z          0.0
    10           n          x          0.0
    11           n          z          0.0
    12           n          x          0.0
    13           n          x          0.0
    14           n          z          0.0
    15           y          x          8.5
    16           n          z          0.0
    17           n          z          0.0
    18           n          x          0.0
    19           y          y          0.0
    

    【讨论】:

    • 感谢@piRSquared!这正是我想要做出改变的确切方式。看来 data[data[([Highschool]=='x') & ([CreditScore]=='y')]]['Scholarship'] 只是创建数据帧的副本,而 data.loc[( data['Highschool']=='x') & (data['CreditScore']=='y'), 'Scholarship'] 从 DataFrame 中调用列'Scholarship',其中索引 Highschool 和 CreditScore 符合条件。如果我误解了,请告诉我。再次感谢您。
    【解决方案2】:
    def change_grade(x):
        ...:     if x[0] == 'x' and x[1] == 'y':
        ...:         return x[2] + 8.5
        ...:     else:
        ...:         pass
    

    0是'Highschool'的列索引,1是'CreditScore'的索引,2是'Scholarship'的索引

    df['Scholarship'] = df.apply(change_grade, axis = 1)
    

    不过,@piRSquared 一如既往地建议了一个更有说服力的班轮。

    【讨论】:

    • 谢谢 Dmitry,感谢您的意见。我一直在寻找一种方法,而不是创建一个函数来更改所述列的值,尽管我同意有时函数有其优势。祝你有美好的一天。
    猜你喜欢
    • 2018-06-08
    • 2013-11-20
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多