说我有以下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非常大,此过程需要很多时间。
是否有更简单的方法来批量执行此操作,而不是逐列进行操作?
谢谢
答案 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