gpt4 book ai didi

python - 如何使用 Python 和/或 R 在数据帧的值之间进行插值

转载 作者:行者123 更新时间:2023-11-28 20:39:38 24 4
gpt4 key购买 nike

我有一个看起来像这样的数据集:

image of a dataset

我使用 pandas.read_csv 将 Year 和 Country 列作为索引导入到 pandas 数据框中。我需要做的是将时间步长从每 5 年更改为每年,并插入所述值,但我真的不知道如何做到这一点。我正在学习 R 和 Python,因此非常感谢任何一种语言的帮助。

最佳答案

  • 如果您为 DataFrame 提供 DatetimeIndex,那么您可以利用 df.resampledf.interpolate('time') 方法。

  • 要使 df.index 成为 DatetimeIndex,您可能会想使用 set_index('Year')。但是,Year 本身并不是唯一的,因为每个 Country 都会重复它。为了调用 resample,我们需要一个唯一索引。所以使用 df.pivot 代替:

    # convert integer years into `datetime64` values
    In [441]: df['Year'] = (df['Year'].astype('i8')-1970).view('datetime64[Y]')
    In [442]: df.pivot(index='Year', columns='Country')
    Out[442]:
    Avg1 Avg2
    Country Australia Austria Belgium Australia Austria Belgium
    Year
    1950-01-01 0 0 0 0 0 0
    1955-01-01 1 1 1 10 10 10
    1960-01-01 2 2 2 20 20 20
    1965-01-01 3 3 3 30 30 30
  • 然后您可以使用 df.resample('A').mean()resample the data每年频率。您可以将 resample('A') 视为将 df 分成几组间隔 1 年。 resample 返回一个 DatetimeIndexResampler 对象,其mean 方法通过取平均值来聚合每个组中的值。因此mean() 返回一个 DataFrame,每年一行。既然你原来的df 每 5 年有一个数据,大部分 1 年组将是空的,所以这些年的平均值返回 NaN。如果您的数据始终间隔在5 年间隔,然后可以使用 .first() 代替 .mean().last() 代替。它们都会返回相同的结果。

    In [438]: df.resample('A').mean()
    Out[438]:
    Avg1 Avg2
    Country Australia Austria Belgium Australia Austria Belgium
    Year
    1950-12-31 0.0 0.0 0.0 0.0 0.0 0.0
    1951-12-31 NaN NaN NaN NaN NaN NaN
    1952-12-31 NaN NaN NaN NaN NaN NaN
    1953-12-31 NaN NaN NaN NaN NaN NaN
    1954-12-31 NaN NaN NaN NaN NaN NaN
    1955-12-31 1.0 1.0 1.0 10.0 10.0 10.0
    1956-12-31 NaN NaN NaN NaN NaN NaN
    1957-12-31 NaN NaN NaN NaN NaN NaN
    1958-12-31 NaN NaN NaN NaN NaN NaN
    1959-12-31 NaN NaN NaN NaN NaN NaN
    1960-12-31 2.0 2.0 2.0 20.0 20.0 20.0
    1961-12-31 NaN NaN NaN NaN NaN NaN
    1962-12-31 NaN NaN NaN NaN NaN NaN
    1963-12-31 NaN NaN NaN NaN NaN NaN
    1964-12-31 NaN NaN NaN NaN NaN NaN
    1965-12-31 3.0 3.0 3.0 30.0 30.0 30.0
  • 然后 df.interpolate(method='time') 将根据最近的非 NaN 值及其关联的日期时间索引值线性插入缺失的 NaN 值。


import numpy as np
import pandas as pd

countries = 'Australia Austria Belgium'.split()
year = np.arange(1950, 1970, 5)
df = pd.DataFrame(
{'Country': np.repeat(countries, len(year)),
'Year': np.tile(year, len(countries)),
'Avg1': np.tile(np.arange(len(year)), len(countries)),
'Avg2': 10*np.tile(np.arange(len(year)), len(countries))})
df['Year'] = (df['Year'].astype('i8')-1970).view('datetime64[Y]')
df = df.pivot(index='Year', columns='Country')

df = df.resample('A').mean()
df = df.interpolate(method='time')

df = df.stack('Country')
df = df.reset_index()
df = df.sort_values(by=['Country', 'Year'])
print(df)

产量

         Year    Country      Avg1       Avg2
0 1950-12-31 Australia 0.000000 0.000000
3 1951-12-31 Australia 0.199890 1.998905
6 1952-12-31 Australia 0.400329 4.003286
9 1953-12-31 Australia 0.600219 6.002191
12 1954-12-31 Australia 0.800110 8.001095
15 1955-12-31 Australia 1.000000 10.000000
18 1956-12-31 Australia 1.200328 12.003284
21 1957-12-31 Australia 1.400109 14.001095
...

关于python - 如何使用 Python 和/或 R 在数据帧的值之间进行插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37633711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com