如果在特定日期之前他们是NaN,那么在熊猫中删除列

时间:2017-05-17 09:56:20

标签: python pandas nan

我有一个大型数据框,其中包含不同开始日期的测量值。我现在想把它减少到只包含比特定日期更早的测量的数据帧。

我想转此:

            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')

我该如何做到最好?

1 个答案:

答案 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

BEGIN_DATE

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