我有一个大型数据框,其中包含不同开始日期的测量值。我现在想把它减少到只包含比特定日期更早的测量的数据帧。
我想转此:
A B C D E
1950-11-01 3 NaN NaN NaN NaN
1950-12-01 2 NaN NaN NaN 5
1951-01-01 NaN NaN NaN NaN 4
1951-02-01 3 4 NaN NaN NaN
1951-03-01 2 3 4 NaN 5
进入这个:
A E
1950-11-01 3 NaN
1950-12-01 2 5
1951-01-01 NaN 4
1951-02-01 3 NaN
1951-03-01 2 5
也就是说,我希望 仅 删除在1951年之前完全填充NaN的列。如果数据中有单个NaN(来自测量失败),则应该留下来。
我可以使用df['1940':'1950']
找到有问题的列,只选择有问题的时间,然后执行df.dropna(axis = 1, how = 'all')
,但这样,我在1951年之后丢失了部分,这对我来说很有趣。我可以使用它的输出,提取相关列的标签,然后从原始数据集中选择它们,但它是一个6级多索引,整个df有2000列,所以这当然不是最佳方式做到这一点。
基本上,我想做一些像
这样的事情longtermdata = alldata.dropna(axis = 1, how = 'all that are NaN before 1951')
我该如何做到最好?
答案 0 :(得分:3)
begin_date = pd.to_datetime('1951-01-01')
cols = ~df.loc[:begin_date].isnull().all()
最初我有
cols = df.columns[~df.loc[:begin_date].isnull().all()]
但df.columns
确实不需要.loc
。感谢@unutbu
df.loc[begin_date:, cols]
给出了
A E
1951-01-01 NaN 4.0
1951-02-01 3.0 NaN
1951-03-01 2.0 5.0
df.loc[:,cols]
给出了
A E
1950-11-01 3.0 NaN
1950-12-01 2.0 5.0
1951-01-01 NaN 4.0
1951-02-01 3.0 NaN
1951-03-01 2.0 5.0
df.loc[:begin_date]
包含begin_date
如果不符合预期,请将其替换为df[df.index < begin_date]