当行数变化时,熊猫将有条件的总和行转换为新列

时间:2019-01-10 05:31:26

标签: python pandas sum conditional row

我的数据格式如下:

enter image description here

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

  1. 通过行号和年份对行进行分组,并将DPS列中的数字求和到一个名为Net_DPS的新列中。
  2. 按行代码和年份对行进行分组,并将EPS列中的数字求和到一个名为Net_EPS的新列中。

按股票行情和年份分组时,行数可以在1-4之间变化。例如,对于1AL,您会看到2014年有一行,而2015年有两行。

最终,我将结果设置为每年每个股票行情的一行,其中Net_EPS和Net_DPS分别显示该年的EPS和DPS的总和。

我在这里尝试了很多建议的解决方案,但是由于行和索引的数量不同,我陷入了困境。

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

我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您希望按行情和年份分类,请尝试以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

答案 1 :(得分:0)

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