数据框列和索引的组合

时间:2020-05-05 10:18:12

标签: python pandas

因此,我有一个数据帧,其中包含带有经纬度对的粒子轨迹列表,粒子的质量以及在特定时间粒子位于其中的单元格。

                         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

对于每个时间步中的每个单元格,我需要知道数量或粒子以及质量的总和。

1 个答案:

答案 0 :(得分:2)

我认为您需要在命名聚合中按GroupBy.agg进行聚合,计数为GroupBy.sizeGroupBy.sum,然后按DataFrame.unstackDataFrame.stack添加缺失的组合:< / p>

@ctrl/ngx-emoji-mart