如果它们在特定日期之前为 NaN,则在熊猫中删除列

dropping columns in panda if they are NaN before a certain date

我有一个大型数据框,其中包含不同开始日期的测量值。我现在想将其缩减为仅包含早于特定日期的测量值的数据框。

我想转这个:

            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'] 找到有问题的列,到 select 只有有问题的时间,然后再做 df.dropna(axis = 1, how = 'all'),但是这样,我就失去了 1951 年之后的部分,这对我来说很有趣。我可以使用它的输出来提取有问题的列的标签,然后从原始数据集中选择那些标签,但它是一个 6 级多索引并且整个 df 有 2000 列,所以这当然不是最佳方式做吧。

本质上,我想做类似

的事情
longtermdata = alldata.dropna(axis = 1, how = 'all that are NaN before 1951')

我该怎么做最好?

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

begin_date

df.loc[:begin_date] 包含 begin_date 如果这不是预期的,请将其替换为 df[df.index < begin_date]