Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 如何使用至少1个非NaN值计算月份?_Pandas - Fatal编程技术网

Pandas 如何使用至少1个非NaN值计算月份?

Pandas 如何使用至少1个非NaN值计算月份?,pandas,Pandas,我有这个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

我有这个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月份至少有一个非NaN值,我有25个2月份至少有一个非NaN值,以此类推


你介意帮我吗?提前感谢。

这可能不是非常高效,但下面是如何为其中一列(在本例中为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)

我修改了答案的第一部分,所以你可以得到每个月的计数,就像你希望得到的那样。