如果它们在特定日期之前为 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]
我有一个大型数据框,其中包含不同开始日期的测量值。我现在想将其缩减为仅包含早于特定日期的测量值的数据框。
我想转这个:
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]