【问题标题】:How to count months with at least 1 non NaN value?如何计算至少有 1 个非 NaN 值的月份?
【发布时间】:2021-03-31 22:49:20
【问题描述】:

我有这个 df:

       CODE YEAR  MONTH DAY TMAX  TMIN   PP
0      130  1991    1    1  32.6  23.4  0.0
1      130  1991    1    2  31.2  22.4  0.0
2      130  1991    1    3  32.0   NaN  0.0
3      130  1991    1    4  32.2  23.0  0.0
4      130  1991    1    5  30.5  22.0  0.0
       ...   ...  ...  ...   ...   ...  ...
20118  130  2018    9   30  31.8  21.2  NaN
30028  132  1991    1    1  35.2   NaN  0.0
30029  132  1991    1    2  34.6   NaN  0.0
30030  132  1991    1    3  35.8   NaN  0.0
30031  132  1991    1    4  34.8   NaN  0.0
      ...   ...  ...  ...   ...   ...   ...
45000  132  2019    10   5  35.5   NaN  21.1
46500  133  1991    1    1  35.5   NaN  21.1

我需要计算 TMAX、TMIN 和 PP 列中至少有 1 个非 NaN 值的月份。如果该月具有所有 nan 值,则该月不计算在内。我需要按每个代码来执行此操作。 期望值:

   CODE  YEAR MONTH  DAY  TMAX  TMIN    PP   JANUARY_TMAX  FEBRUARY_TMAX  MARCH_TMAX  APRIL_TMAX  etc
   130  1991     1    1  32.6  23.4     0           23             25          22          27    …
   130  1991     1    2  31.2  22.4     0           NaN            NaN         NaN         NaN  NaN
   130  1991     1    3    32   NaN     0           NaN            NaN         NaN         NaN  NaN
   130  1991     1    4  32.2    23     0           NaN            NaN         NaN         NaN  NaN
   130  1991     1    5  30.5    22     0           NaN            NaN         NaN         NaN  NaN
   ...   ...   ...  ...   ...   ...   ...           NaN            NaN         NaN         NaN  NaN
   130  2018     9   30  31.8  21.2   NaN           NaN            NaN         NaN         NaN  NaN
   132  1991     1    1  35.2   NaN     0           21             23          22          22    …
   132  1991     1    2  34.6   NaN     0           NaN            NaN         NaN         NaN  NaN
   132  1991     1    3  35.8   NaN     0           NaN            NaN         NaN         NaN  NaN
   132  1991     1    4  34.8   NaN     0           NaN            NaN         NaN         NaN  NaN
   ...   ...   ...  ...   ...   ...   ...           NaN            NaN         NaN         NaN  NaN
   132  2019     1    1  35.5   NaN  21.1           NaN            NaN         NaN         NaN  NaN
   ...   ...   ...  ...   ...   ...   ...           NaN            NaN         NaN         NaN  NaN
   133  1991     1    1  35.5   NaN  21.1           25             22          22          21    …
   ...   ...   ...  ...   ...   ...   ...           NaN            NaN         NaN         NaN  NaN

例如:在 TMAX 列的代码 130 中,我有 23 个 1 月至少有 1 个非 NaN 值,我有 25 个 2 月至少有 1 个非 NaN 值,等等。

你愿意帮助我吗?提前致谢。

【问题讨论】:

    标签: pandas


    【解决方案1】:

    这可能不是超级高效,但您可以通过以下方式为其中一列执行此操作,在这种情况下为 TMAX。只需对其他列重复该过程即可。

    # Count occurrences of each month when TMAX is not null
    tmax_cts_long =  df[df.TMAX.notnull()].drop_duplicates(subset=['CODE', 'YEAR', 'MONTH']).groupby(['CODE', 'MONTH']).size().reset_index(name='COUNT')
    
    # Transpose the long table of counts to wide format
    tmax_cts_wide = tmax_cts_long.pivot(index='CODE', columns='MONTH', values='COUNT')
    
    # Merge table of counts with the original dataframe
    final_df = df.merge(tmax_cts_wide, on='CODE', how='left')
    
    # Replace values in new columns in all rows after the first row with NaN
    mask = final_df.index.isin(df.groupby(['CODE', 'MONTH']).head(1).index)
    final_df.loc[~mask, [col for col in final_df.columns if isinstance(col, int)]] = None
    
    # Rename new columns to follow the desired naming format
    mon_dict = {1: 'JANUARY', 2: 'FEBRUARY', ...}
    tmax_mon_dict = {k: v + '_TMAX' for k, v in mon_dict.items()}
    final_df.rename(columns=tmax_mon_dict, inplace=True)
    

    【讨论】:

    • 我修改了答案的第一部分,这样你就可以得到每个月的计数,就像你希望得到的那样。
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 2019-06-24
    • 2023-01-17
    • 2019-05-15
    • 2020-10-10
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多