用NaN替换字符串中的值

时间:2019-05-25 13:35:58

标签: python-3.x pandas dataframe

面对一个简单的任务,但我无法解决。 df中有一个表:

Date       X1   X2
02.03.2019  2   2
03.03.2019  1   1
04.03.2019  2   3
05.03.2019  1   12
06.03.2019  2   2
07.03.2019  3   3
08.03.2019  4   1
09.03.2019  1   2

我需要日期<05.03.2019设置X1 = NaN,X2 = NaN的行:

Date       X1   X2
02.03.2019  NaN NaN
03.03.2019  NaN NaN
04.03.2019  NaN NaN
05.03.2019  1   12
06.03.2019  2   2
07.03.2019  3   3
08.03.2019  4   1
09.03.2019  1   2

2 个答案:

答案 0 :(得分:3)

首先将列df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y') df.loc[df['Date'] < '2019-03-05', ['X1','X2']] = np.nan print (df) Date X1 X2 0 2019-03-02 NaN NaN 1 2019-03-03 NaN NaN 2 2019-03-04 NaN NaN 3 2019-03-05 1.0 12.0 4 2019-03-06 2.0 2.0 5 2019-03-07 3.0 3.0 6 2019-03-08 4.0 1.0 7 2019-03-09 1.0 2.0 转换为日期时间,然后按DataFrame.loc设置值:

DatetimeIndex

如果有df.index = pd.to_datetime(df.index, format='%d.%m.%Y') #change datetime to 2019-03-04 df.loc[:'2019-03-04'] = np.nan print (df) X1 X2 Date 2019-03-02 NaN NaN 2019-03-03 NaN NaN 2019-03-04 NaN NaN 2019-03-05 1.0 12.0 2019-03-06 2.0 2.0 2019-03-07 3.0 3.0 2019-03-08 4.0 1.0 2019-03-09 1.0 2.0

df.index = pd.to_datetime(df.index, format='%d.%m.%Y')

df.loc[df.index < '2019-03-05'] = np.nan

或者:

{{1}}

答案 1 :(得分:2)

不要使用此解决方案,这只是另一种可能的方法(-:(这会影响所有列

df.mask(df.Date < '05.03.2019').combine_first(df[['Date']])

         Date   X1    X2
0  02.03.2019  NaN   NaN
1  03.03.2019  NaN   NaN
2  04.03.2019  NaN   NaN
3  05.03.2019  1.0  12.0
4  06.03.2019  2.0   2.0
5  07.03.2019  3.0   3.0
6  08.03.2019  4.0   1.0
7  09.03.2019  1.0   2.0