在panda中删除列,如果它们在某个d之前是NaN

2024-10-03 04:35:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的数据帧,其中有不同的开始日期的测量。我现在想把它压缩成一个只包含超过某个日期的测量值的数据帧。在

我想把这个转过来:

            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

在这方面:

^{pr2}$

也就是说,我希望只删除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')

我怎样才能做到最好?在


Tags: 数据方法df原始数据时间标签nanall
1条回答
网友
1楼 · 发布于 2024-10-03 04:35:46
begin_date = pd.to_datetime('1951-01-01')

找到要保留的列

^{pr2}$

最初我有

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]包含{}如果这不是预期的,请将其替换为df[df.index < begin_date]

相关问题 更多 >