因此,我有一个数据帧,其中包含带有经纬度对的粒子轨迹列表,粒子的质量以及在特定时间粒子位于其中的单元格。
lon lat mass cell_bins
time trajectory
2010-06-03 1 -96.467 24.835 0.461 8448b65ffffffff
2 -97.574 24.006 0.460 8445693ffffffff
3 -96.473 24.701 0.454 8448b65ffffffff
4 -96.980 23.322 0.436 844569dffffffff
5 -97.258 24.245 0.452 8448b69ffffffff
... ... ... ...
2010-06-04 1 -96.467 24.835 0.461 8448b65ffffffff
2 -97.574 24.006 0.460 8445693ffffffff
3 -96.473 24.701 0.454 8448b65ffffffff
4 -96.980 23.322 0.436 844569dffffffff
5 -97.258 24.245 0.452 8448b69ffffffff
....
...
我需要做的是创建一个新的数据框,其中包含由cell_bin分组的粒子,以及每个时间步中bin内粒子的总和以及质量总和。
这是我需要的输出:
particle_sum mass_sum
cell_bins time
844575dffffffff 2010-06-03T00:00:00.000000000 2 2.0
2010-06-04T00:00:00.000000000 9 6.9708424
2010-06-05T00:00:00.000000000 15 10.779473
2010-06-06T00:00:00.000000000 12 8.653734
2010-06-07T00:00:00.000000000 8 5.150217
... ... ... ...
84454b9ffffffff 2010-07-29T00:00:00.000000000 0 0.0
2010-07-30T00:00:00.000000000 0 0.0
2010-07-31T00:00:00.000000000 0 0.0
2010-08-01T00:00:00.000000000 0 0.0
2010-08-02T00:00:00.000000000 1 0.34637067
我当前正在做的是一个嵌套循环,由所有唯一的cell_bin和所有源数据帧中的所有时间步组成,这有点尴尬,因为它绝对是一种更高效,更简便的方法。
rows = []
for cellbin in df['cell_bins'].unique():
for timestep in df.index.get_level_values(0).unique().values:
_fdf = df.loc[(timestep)]
_f2df = _fdf[ _fdf['cell_bins']==cellbin ]
rows.append( [cellbin, timestep, _f2df['mass'].size, _f2df['mass'].sum() ] )
binsdf = pd.DataFrame(np.array(rows) , columns=['cell_bins', 'time', 'particle_sum', 'mass_sum'] )
binsdf.set_index(['cell_bins','time'], inplace=True)
我可以找到一种将分组正确组合的方法,有人可以提供更好的策略吗?谢谢
编辑:2020年5月5日
在@jezrael请求中,我提供了一个最小示例。
在此示例中,我省略了纬度/经度对,因此在该示例中不需要它们:
import pandas as pd
idx = pd.MultiIndex.from_product([['2010-06-03','2010-06-04','2010-06-05'],
[1, 2, 3]],
names=['time', 'trajectory'])
cols = ['mass','cell_bins']
df = pd.DataFrame([[0.2,'A'],[0.4,'A'],[0.3,'A'],
[0.1,'A'],[0.2,'B'],[0.3,'B'],
[0.1,'B'],[0.2,'C'],[0.3,'C']], idx, cols)
数据框:
mass cell_bins
time trajectory
2010-06-03 1 0.2 A
2 0.4 A
3 0.3 A
2010-06-04 1 0.1 A
2 0.2 B
3 0.3 B
2010-06-05 1 0.1 B
2 0.2 C
3 0.3 C
我需要创建的输出是:
particle_sum mass_sum
cell_bins time
A 2010-06-03 3 0.9
2010-06-04 1 0.1
2010-06-05 0 0.0
B 2010-06-03 0 0.0
2010-06-04 2 0.5
2010-06-05 1 0.1
C 2010-06-03 0 0.0
2010-06-04 0 0.0
2010-06-05 2 0.5
对于每个时间步中的每个单元格,我需要知道数量或粒子以及质量的总和。
答案 0 :(得分:2)
我认为您需要在命名聚合中按GroupBy.agg
进行聚合,计数为GroupBy.size
和GroupBy.sum
,然后按DataFrame.unstack
和DataFrame.stack
添加缺失的组合:< / p>
@ctrl/ngx-emoji-mart