熊猫:将年度数据转换为十年数据

时间:2020-04-30 09:51:21

标签: python pandas

背景

我想确定变量从1990年到2014年(即1990年,2000年,2010年(分别为3个十年))不同十年的全局累计值。我有不同国家的年度数据。但是,数据可用性并不统一。

Sample of data shown in the table

现有问题

使用R:1

以下问题着眼于日期格式问题:23

这些问题的答案不能解决当前问题。

当前问题

如何使用Pandas的功能/工具来获得不同年代的全球总和?

预期结果

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)

由于使用熊猫的经验较少,因此这不是最佳方法。请提出一个使用熊猫功能的更好的方法。谢谢。

1 个答案:

答案 0 :(得分:1)

如果我叫df的{​​{3}}像这样:

>>> 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的{​​{3}}:

>>> 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