我确实有一个分组的数据框。这是一组示例:
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
给了我所有值的数组,而不是实际组的值。所以我可以从数据框中的所有值中减去例如ID == stock的样本来自第一组(values[0]
)。如何仅从同一组样本中减去股票价值?
最佳答案
我认为@filmor回答了您的问题。可能您误解了。
我通过重复您提供的数据和修改的索引来构成一个数据框。
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]
关于python - 每组中的 Pandas 计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23870745/