Pandas 当行数不同时,有条件地将行求和到新列中
Pandas conditional sum rows into new column when number of rows vary
我有以下格式的数据:
我正在尝试使用 python 3.x 在 pandas 数据框中执行以下操作:
- 按代码和年份对行进行分组,并将 DPS 列中的数字汇总到名为 Net_DPS 的新列中。
- 按代码和年份对行进行分组,并将 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'})
我有以下格式的数据:
我正在尝试使用 python 3.x 在 pandas 数据框中执行以下操作:
- 按代码和年份对行进行分组,并将 DPS 列中的数字汇总到名为 Net_DPS 的新列中。
- 按代码和年份对行进行分组,并将 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'})