Pandas:将年度数据转换为十年数据

2024-04-25 05:08:22 发布

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

背景

我想确定一个变量从1990年到2014年不同时期的全球累积值,即1990年、2000年、2010年(分别为30年)。我有不同国家的年度数据。然而,数据可用性并不统一

Sample of data shown in the table

现有问题

使用R:1

以下问题关注日期格式问题:23

这些问题的答案并不针对当前问题

当前问题

如何使用熊猫的特征/工具获得不同时期的全球总和

预期结果

1990-2000 x1

2000-2010 x2

2010-2015 x3

目前使用的方法

data_binned = data_pivoted.copy()
decade = []

# obtaining decade values for each country

for i in range(1960, 2017):

    if i in list(data_binned):

        # adding the columns into the decade list
        decade.append(i)

    if i % 10 == 0:

        # adding large header so that newly created columns are set at the end of the dataframe
        data_binned[i *10] = data_binned.apply(lambda x: sum(x[j] for j in decade), axis=1)
        decade = []

for x in list(data_binned):
    if x < 3000:
        # removing non-decade columns
        del data_binned[x]

# renaming the decade columns
new_names = [int(x/10) for x in list(data_binned)]
data_binned.columns = new_names

# computing global values
global_values = data_binned.sum(axis=0)

这是一种非最佳方法,因为使用熊猫的经验较少。请推荐一种更好的方法,利用大熊猫的特征。多谢各位


Tags: columnsthe数据方法infordataif
1条回答
网友
1楼 · 发布于 2024-04-25 05:08:22

如果我让^{}调用df的样子如下:

>>> df = pd.DataFrame(
...     {
...         1990: [1, 12, 45, 67, 78],
...         1999: [1, 12, 45, 67, 78],
...         2000: [34, 6, 67, 21, 65],
...         2009: [34, 6, 67, 21, 65],
...         2010: [3, 6, 6, 2, 6555],
...         2015: [3, 6, 6, 2, 6555],
...     }, index=['country_1', 'country_2', 'country_3', 'country_4', 'country_5']
... )
>>> print(df)
           1990  1999  2000  2009  2010  2015
country_1     1     1    34    34     3     3
country_2    12    12     6     6     6     6
country_3    45    45    67    67     6     6
country_4    67    67    21    21     2     2
country_5    78    78    65    65  6555  6555

我可以用几十年的统计数据制作另一个名为df_decades^{},如下所示:

>>> df_decades = pd.DataFrame()
>>> 
>>> for decade in set([(col // 10) * 10 for col in df.columns]):
...     cols_in_decade = [col for col in df.columns if (col // 10) * 10 == decade]
...     df_decades[f'{decade}-{decade + 9}'] = df[cols_in_decade].sum(axis=1)
>>>
>>> df_decades = df_decades[sorted(df_decades.columns)]
>>> print(df_decades)
           1990-1999  2000-2009  2010-2019
country_1          2         68          6
country_2         24         12         12
country_3         90        134         12
country_4        134         42          4
country_5        156        130      13110

这背后的想法是迭代df中列名提供的所有可能的十年,过滤这些列,这些列是十年的一部分,并将它们聚合

最后,我可以将这些数据帧合并在一起,这样我的数据帧df可以通过第二个数据帧df_decades的几十年统计数据来丰富

>>> df = pd.merge(left=df, right=df_decades, left_index=True, right_index=True, how='left')
>>> print(df)
           1990  1999  2000  2009  2010  2015  1990-1999  2000-2009  2010-2019
country_1     1     1    34    34     3     3          2         68          6
country_2    12    12     6     6     6     6         24         12         12
country_3    45    45    67    67     6     6         90        134         12
country_4    67    67    21    21     2     2        134         42          4
country_5    78    78    65    65  6555  6555        156        130      13110

相关问题 更多 >