我的数据格式如下:
我正在尝试使用python 3.x在熊猫数据框中执行以下操作:
按股票行情和年份分组时,行数可以在1-4之间变化。例如,对于1AL,您会看到2014年有一行,而2015年有两行。
最终,我将结果设置为每年每个股票行情的一行,其中Net_EPS和Net_DPS分别显示该年的EPS和DPS的总和。
我在这里尝试了很多建议的解决方案,但是由于行和索引的数量不同,我陷入了困境。
EPS和DPS列的数据格式为float64。
我将非常感谢您的帮助。
答案 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'})