我有一个包含2个时间序列的pandas.DataFrame
对象。一个系列比另一个系列短得多。
我想确定最短系列中数据可用的更远日期,并在该日期之前删除2列中的数据。
最狡猾的方式是什么?
(我很抱歉我并没有真正遵循提交问题的SO指南)
以下是我的数据框的一个片段:
osr go
Date
1990-08-17 NaN 239.75
1990-08-20 NaN 251.50
1990-08-21 352.00 265.00
1990-08-22 353.25 274.25
1990-08-23 351.75 290.25
在这种情况下,我希望在1990-08-21之前删除所有行(我添加了其中一个列中可能有更新日期的NAs)
答案 0 :(得分:2)
您可以在s
的倒置df['osr'][::-1]
中使用idxmax
,然后使用df
的子集:
print df
# osr go
#Date
#1990-08-17 NaN 239.75
#1990-08-20 NaN 251.50
#1990-08-21 352.00 265.00
#1990-08-22 353.25 274.25
#1990-08-23 351.75 290.25
s = df['osr'][::-1]
print s
#Date
#1990-08-23 351.75
#1990-08-22 353.25
#1990-08-21 352.00
#1990-08-20 NaN
#1990-08-17 NaN
#Name: osr, dtype: float64
maxnull = s.isnull().idxmax()
print maxnull
#1990-08-20 00:00:00
print df[df.index > maxnull]
# osr go
#Date
#1990-08-21 352.00 265.00
#1990-08-22 353.25 274.25
#1990-08-23 351.75 290.25
答案 1 :(得分:1)
编辑:基于评论/修改的新答案
这听起来像数据是连续的,一旦你有没有数据的行你想要抛出它们。这可以通过dropna轻松完成。
df = df.dropna()
这个答案假设一旦你通过坏行,他们就会保持良好状态。或者,如果你不关心在中间删除行...取决于你需要的顺序。如果数据需要是连续的并且您的输入结构良好,以色列的答案是好的
原始回答
你的数据框架中没有给出太多结构,所以我将在这里做出假设。我假设您有很多列,其中两个:time_series_1
和time_series_2
是您在问题中提到的列,这些列都存储在df
首先,我们只需使用
即可找到较短的系列shorter_col = df['time_series_1'] if len(df['time_series_1']) > len(df['time_series_2']) else df['time_series_2']
现在我们想要那个
中的最后一个日期remove_date = max(shorter_col)
现在我们要在该日期之前删除数据
mask = (df['time_series_1'] > remove_date) | (df['time_series_2'] > remove_date)
df = df[mask]