每组Pandas计算

2024-05-11 04:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个分组数据框。以下是一组示例:

name    pH   salt  id   
sample  7.5  50    1        0.48705
                   2        0.42875
                   3        0.38885
                   4        0.34615
                   5        0.35060
                   6        0.29280
                   7        0.28210
                   8        0.24535
                   stock    0.66090

对于每个组,都有一个定义初始质量的库存解决方案。我想迭代所有的组,并从每个项目中减去初始质量。我不想显式地写df_grouped['sample'][7.5][50]这样的东西。如果可能,我希望避免任何嵌套循环。

有什么建议吗?

我只能想出这样的解决方案:

for na, gr in df_label_gr:
    if 'stock' in na:
        print(na)

这给了我:

('sample', 7.5, 50.0, 'stock')
('sample', 7.5, 150.0, 'stock')
('sample', 8.5, 50.0, 'stock')
('sample', 8.5, 150.0, 'stock')

所以我可以用前三个条目索引我的组并做一些计算。

编辑:

为了不把讨论搞砸,我在这里再次提出同样的问题,并做了一点小小的修改:

不同的是,在这里我想从每个组中减去不同的值,但要根据组的具体情况来做

name    pH   salt  id   
sample  7.5  50    1        0.48705
                   2        0.42875
                   3        0.38885
                   4        0.34615
                   5        0.35060
                   6        0.29280
                   7        0.28210
                   8        0.24535
                   stock    0.66090
sample  8.5  50    1        0.48705
                   2        0.42875
                   3        0.38885
                   4        0.34615
                   5        0.35060
                   6        0.29280
                   7        0.28210
                   8        0.24535
                   stock    0.1

我尝试了以下方法:

df = a2_01.df.reset_index()
df.groupby(by = ['name','pH','salt','id']).aggregate(np.sum).apply(lambda x: x - x[x.index.get_level_values('id') == 'stock'].values[0])

问题是,x[x.index.get_level_values('id') == 'stock'].values给了我一个包含所有值的数组,而不是实际组的值。所以我可以从第一个组(values[0])中的所有值减去id==stock的样本。

我怎样才能从同一组样本中减去股票的价值呢?


Tags: samplenameiniddfgetindexstock
2条回答

您可以为此使用groupby,特别是df_grouped.groupby(level=[0, 1, 2]).apply(fancy_func)在您的情况下,其中fancy_func接受子数据帧并返回值。

结果将是一系列值,按相同级别索引。

我想“菲莫”回答了你的问题。可能你误解了。

我通过重复您提供的数据和修改的索引,构建了一个数据框架。

In [117]: df
Out[117]: 
                          mass
name   pH  salt id            
sample 7.5 50   1      0.48705
                2      0.42875
                3      0.38885
                4      0.34615
                5      0.35060
                6      0.29280
                7      0.28210
                8      0.24535
                stock  0.66090
           150  1      0.48705
                2      0.42875
                3      0.38885
                4      0.34615
                5      0.35060
                6      0.29280
                7      0.28210
                8      0.24535
                stock  0.66090
       8.5 50   1      0.48705
                2      0.42875
                3      0.38885
                4      0.34615
                5      0.35060
                6      0.29280
                7      0.28210
                8      0.24535
                stock  0.66090
           150  1      0.48705
                2      0.42875
                3      0.38885
                4      0.34615
                5      0.35060
                6      0.29280
                7      0.28210
                8      0.24535
                stock  0.66090

[36 rows x 1 columns]

如果确定每个组中的stock总是最后一个(如有必要,在排序之后),可以执行以下操作。否则,df.groupby(level= [0,1,2]).apply(lambda g: g - g[g.index.get_level_values('id')=='stock'].values[0])应该可以工作。

In [118]: df.groupby(level= [0,1,2]).apply(lambda g: g - g.iloc[-1,0])
Out[118]: 
                          mass
name   pH  salt id            
sample 7.5 50   1     -0.17385
                2     -0.23215
                3     -0.27205
                4     -0.31475
                5     -0.31030
                6     -0.36810
                7     -0.37880
                8     -0.41555
                stock  0.00000
           150  1     -0.17385
                2     -0.23215
                3     -0.27205
                4     -0.31475
                5     -0.31030
                6     -0.36810
                7     -0.37880
                8     -0.41555
                stock  0.00000
       8.5 50   1     -0.17385
                2     -0.23215
                3     -0.27205
                4     -0.31475
                5     -0.31030
                6     -0.36810
                7     -0.37880
                8     -0.41555
                stock  0.00000
           150  1     -0.17385
                2     -0.23215
                3     -0.27205
                4     -0.31475
                5     -0.31030
                6     -0.36810
                7     -0.37880
                8     -0.41555
                stock  0.00000

[36 rows x 1 columns]

相关问题 更多 >