在日期X之前为DataFrame中的每一列删除值

时间:2019-04-08 15:31:31

标签: python datetime dataframe

说我有以下DataFrame:

d = pd.DataFrame({'A': [20, 0.5, 40, 45, 40, 35, 20, 25], 
                  'B' : [5, 10, 6, 8, 9, 7, 5, 8]}, 
                   index = pd.date_range(start = "2010Q1", periods = 8, freq = 'QS'))

               A   B
2010-01-01  20.0   5
2010-04-01   0.5  10
2010-07-01  40.0   6
2010-10-01  45.0   8
2011-01-01  40.0   9
2011-04-01  35.0   7
2011-07-01  20.0   5
2011-10-01  25.0   8

另外,假设我有以下一系列日期:

D = d.idxmax()

A   2010-10-01
B   2010-04-01
dtype: datetime64[ns]

我想要做的是实质上是“删除” DataFrame d中出现在每个列的D系列日期之前的值

也就是说,我正在寻找的是:

               A     B
2010-01-01   NaN   NaN
2010-04-01   NaN  10.0
2010-07-01   NaN   6.0
2010-10-01  45.0   8.0
2011-01-01  40.0   9.0
2011-04-01  35.0   7.0
2011-07-01  20.0   5.0
2011-10-01  25.0   8.0

请注意,2010年10月1日之前的A列中的所有值均已删除,B列中的所有值均在2010-04-01年之前均被删除。

相当简单地遍历各列以执行此操作,但是我正在使用的DataFrame非常大,此过程需要很多时间。

是否有更简单的方法来批量执行此操作,而不是逐列进行操作?

谢谢

1 个答案:

答案 0 :(得分:0)

不确定这是否是最优雅的答案,但是由于还没有其他答案,我想我会提供一个可行的解决方案:

import pandas as pd
import numpy as np
import datetime

d = pd.DataFrame({'A': [20, 0.5, 40, 45, 40, 35, 20, 25], 
                  'B' : [5, 10, 6, 8, 9, 7, 5, 8]}, 
                   index = pd.date_range(start = "2010Q1", periods = 8, freq = 'QS'))

D = d.idxmax()


for column in D.index:
    d.loc[d.index < D[column], column] = np.nan

输出:

            A       B
2010-01-01  NaN     NaN
2010-04-01  NaN     10.0
2010-07-01  NaN     6.0
2010-10-01  45.0    8.0
2011-01-01  40.0    9.0
2011-04-01  35.0    7.0
2011-07-01  20.0    5.0
2011-10-01  25.0    8.0