Pandas 当行数不同时,有条件地将行求和到新列中

Pandas conditional sum rows into new column when number of rows vary

我有以下格式的数据:

我正在尝试使用 python 3.x 在 pandas 数据框中执行以下操作:

  1. 按代码和年份对行进行分组,并将 DPS 列中的数字汇总到名为 Net_DPS 的新列中。
  2. 按代码和年份对行进行分组,并将 EPS 列中的数字汇总到名为 Net_EPS 的新列中。

按代码和年份分组时,行数可以从 1 到 4 不等。例如,对于 1AL,您会看到 2014 年有一行,2015 年有两行。

最终,我将结果设为每一年的每个代码一行,Net_EPS 和 Net_DPS 分别显示当年的 EPS 和 DPS 总和。

我在这里尝试了很多建议的解决方案,但由于行数和索引不同,我卡住了。

EPS 和 DPS 列的数据格式为 float64。

非常感谢任何帮助。

正如您希望按股票代码和年份进行 oto groupy 一样,尝试按相同的顺序 groupby

df = pd.DataFrame({'Ticker': ['1AL']*6 + ['3PL']*7,
                  'Year':[2014, 2015, 2015, 2016, 2016, 2017, 2014, 2014, 2015, 2015, 2016, 2017, 2018],
                  'EPS': np.random.rand(13),
                  'DPS':np.random.rand(13)})
df

    Ticker  Year    EPS           DPS
0   1AL     2014    0.033661    0.912861
1   1AL     2015    0.865936    0.326705
2   1AL     2015    0.398157    0.404424
3   1AL     2016    0.060185    0.482212
4   1AL     2016    0.348479    0.043894
5   1AL     2017    0.745728    0.900050
6   3PL     2014    0.581675    0.701467
7   3PL     2014    0.407660    0.371662
8   3PL     2015    0.984192    0.908538
9   3PL     2015    0.702109    0.064220
10  3PL     2016    0.376621    0.004566
11  3PL     2017    0.290292    0.171509
12  3PL     2018    0.631235    0.666724

df.groupby(['Ticker', 'Year']).sum().rename(columns = {'EPS': 'Net_EPS', 'DPS':'Net_DPS'})


                 Net_EPS    Net_DPS
Ticker  Year        
1AL     2014    0.033661    0.912861
        2015    1.264093    0.731129
        2016    0.408664    0.526106
        2017    0.745728    0.900050
3PL     2014    0.989335    1.073130
        2015    1.686301    0.972758
        2016    0.376621    0.004566
        2017    0.290292    0.171509
        2018    0.631235    0.666724

如果您不想要关卡,请尝试:

df.groupby(['Ticker', 'Year'], level = 0).transform('sum').rename(columns = {'EPS': 'Net_EPS', 'DPS':'Net_DPS'})

    Ticker  Year    Net_EPS Net_DPS
0   1AL 2014    0.033661    0.912861
1   1AL 2015    0.865936    0.326705
2   1AL 2015    0.398157    0.404424
3   1AL 2016    0.0601846   0.482212
4   1AL 2016    0.348479    0.0438939
5   1AL 2017    0.745728    0.90005
6   3PL 2014    0.581675    0.701467
7   3PL 2014    0.40766 0.371662
8   3PL 2015    0.984192    0.908538
9   3PL 2015    0.702109    0.0642203
10  3PL 2016    0.376621    0.00456638
11  3PL 2017    0.290292    0.171509
12  3PL 2018    0.631235    0.666724

编辑:我想你需要这个,在groupby中将as_index设置为False:

df.groupby(['Ticker', 'Year'], as_index = False).sum().rename(columns = {'EPS': 'Net_EPS', 'DPS':'Net_DPS'}

    Ticker  Year    Net_EPS     Net_DPS
0   1AL     2014    0.916628    0.964412
1   1AL     2015    0.461967    1.380665
2   1AL     2016    1.024019    0.521853
3   1AL     2017    0.664347    0.763935
4   3PL     2014    0.550123    0.554489
5   3PL     2015    0.844655    1.636665
6   3PL     2016    0.924291    0.270274
7   3PL     2017    0.225108    0.860416
8   3PL     2018    0.446283    0.180444

df = df.groupby(['Ticker', 'Year'], as_index = False).sum().rename(columns = {'EPS' : 'Net_EPS', 'DPS':'Net_DPS'})