对于在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'对象是可变的,因此它们不能被散列
非常感谢任何帮助。
答案 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