【问题标题】:Changing values of a column based on other two column comparison in pandas根据熊猫中的其他两列比较更改列的值
【发布时间】:2018-10-15 09:27:48
【问题描述】:

对于以下在pandas中创建的数据表,

Date        Score    Study_Date
02/2011      70       11/2012   
03/2011      72       11/2012   
10/2011      60       11/2012
12/2011      50       11/2012
01/2012      40       11/2012
02/2012      60       11/2012
03/2012      75       11/2012
11/2012      70       11/2012
12/2012      70       11/2012
01/2013      30       11/2012
02/2013      20       11/2012
04/2013      60       11/2012
06/2013      80       11/2012

我想将日期在学习日期之前的行的所有分数替换为 0。

我尝试了以下方法:

df[df.Date < df.Study_Date, 'Score']=0

但我明白了:

TypeError: 'Series' 对象是可变的,因此它们不能被散列

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas indexing time-series


    【解决方案1】:

    使用.loc 分配您的值,将感兴趣的列命名为第二个“参数”。这里的前两行只是为了确保您的日期列是正确的datetime 系列(如果它们已经是正确的dtype,您可以跳过它们)。

    # Make sure your columns are datetimes:
    df['Date'] = pd.to_datetime(df.Date)
    df['Study_Date'] = pd.to_datetime(df.Study_Date)
    # Use .loc
    df.loc[df.Date < df.Study_Date, 'Score'] = 0
    
             Date  Score Study_Date
    0  2011-02-01      0 2012-11-01
    1  2011-03-01      0 2012-11-01
    2  2011-10-01      0 2012-11-01
    3  2011-12-01      0 2012-11-01
    4  2012-01-01      0 2012-11-01
    5  2012-02-01      0 2012-11-01
    6  2012-03-01      0 2012-11-01
    7  2012-11-01     70 2012-11-01
    8  2012-12-01     70 2012-11-01
    9  2013-01-01     30 2012-11-01
    10 2013-02-01     20 2012-11-01
    11 2013-04-01     60 2012-11-01
    12 2013-06-01     80 2012-11-01
    

    loc 语句读取为(在伪代码中):在数据框 df 中查找列 Score 的值,其中 df.Date &lt; df.Study_Date

    您的代码有问题

    理论上,您可以在没有loc 语句的情况下执行此操作,与您尝试的类似,但这涉及链式索引pandas 会给您一个警告),对于good reason,通常不推荐

    df['Score'][df.Date < df.Study_Date] = 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多