对Pandas的时间序列数据进行重采样,用先前的D填充Nans

2024-04-25 20:48:15 发布

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

我有一些时间序列数据,大部分是季度性的,但是以年-月-日的格式报告了多个变量和多个国家,但是有些日期的一些变量已经在季度的最后一天发布,其他的可能在接近最后一天发布。我想执行一个重新采样,将每一行聚集到频率的四分之一末尾。我有这个:

Date          Country Var1 Var2 Var3
2012-03-30    China   12   Nan   200
2012-03-31    China   Nan  50    Nan
2012-06-28    China   13   Nan   199
2012-06-30    China   Nan  48    Nan
2012-09-30    China   13   49    200
2012-12-31    China   12   50    201

我想看到的是

^{pr2}$

我尝试了几种不同的重采样方法。首先我试过了

    df=df.groupby("Country").resample('Q').applymap(lambda x: df.shift(1) if math.isnan(x) else x)

然后我试着把所有的nan转换成0,然后按sum进行聚合,但这并不理想,因为我无法跟踪哪些数据实际上是零,哪些数据丢失了。在

    df=df.fillna(0) 
    df=df.groupby("Country").resample('Q').sum()

Tags: 数据df格式报告时间序列国家nan
1条回答
网友
1楼 · 发布于 2024-04-25 20:48:15

下面是一个小例子,其中包含我自己的数据帧,可以按照您的需要进行操作。在

# creating the dataframe
df = pd.DataFrame(np.random.randn(8, 3), columns=['Var1', 'Var2', 'Var3'])

# adding NaN values
df.iloc[1]['Var1'] = np.nan
df.iloc[5]['Var1'] = np.nan

df.iloc[4]['Var2'] = np.nan
df.iloc[6]['Var2'] = np.nan

df

'''
    Var1        Var2        Var3
0   -0.437551   -2.707623   0.726240
1   NaN         2.529733    0.484732
2   0.199278    -0.316516   -0.655426
3   0.732910    -0.638045   -0.706436
4   0.877915    NaN         -1.141384
5   NaN         -2.050228   2.091994
6   -1.119849   NaN         1.222602
7   0.406632    -2.255687   0.742452
'''

# backfilling values in Var2
df['Var2'] = df['Var2'].fillna(method='backfill').dropna()

# dropping NaN rows based on column Var1
df.dropna()

df

'''
    Var1        Var2        Var3
0   -0.437551   -2.707623   0.726240
2   0.199278    -0.316516   -0.655426
3   0.732910    -0.638045   -0.706436
4   0.877915    -2.050228   -1.141384
6   -1.119849   -2.255687   1.222602
7   0.406632    -2.255687   0.742452
'''

相关问题 更多 >