根据pandas中的其他两列比较更改列的值

时间:2018-05-04 20:25:39

标签: python pandas indexing time-series

对于在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'对象是可变的,因此它们不能被散列

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

使用.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语句读取为(在伪代码中):在数据框Score中查找列df的值,其中df.Date < df.Study_Date

您的代码问题

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

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