我有表格的数据
data = [{'Energy': 2,'spin': 1},{'Energy': 6,'spin': 2},{'Energy':5,'spin':2},
{'Energy': 15,'spin': 5},{'Energy': 4,'spin': 1}, {'Energy': 10,'spin': 5}]
df=pd.DataFrame(data, index=['Particle 1', 'Particle 2','Particle 3',
'Particle 4','Particle 5','Particle 6'])
print(df)对于每一组具有相同自旋的粒子,我只想保留一个能量最小的粒子,而剩下的粒子则下降。这样,生成的dataframe应该如下所示:
dataclean = [{'Energy': 2,'spin': 1},{'Energy': 5,'spin': 2},{'Energy': 10,'spin': 5}]
df2=pd.DataFrame(dataclean, index=['Particle 1','Particle 3','Particle 6'])
print(df2)
Energy spin
Particle 1 2 1
Particle 3 5 2
Particle 6 10 5我尝试过不同的方法,但都失败了。做这件事最简单的方法是什么?
发布于 2017-03-11 03:43:51
您可以使用idxmin()来找出每个自旋能量最小的索引,然后使用它对原始数据帧进行子集(假设没有重复索引):
df.loc[df.groupby("spin").Energy.idxmin()]

另一种选择:使用nsmallest
df.groupby('spin').Energy.nsmallest(1).reset_index(level=0)

发布于 2017-03-11 09:04:19
更新:
源DF
In [70]: df
Out[70]:
Energy spin
Particle 1 2 1
Particle 2 6 2
Particle 3 5 2
Particle 4 15 5
Particle 5 4 1
Particle 6 10 5
Particle 7 10 5 # i've added this row解决方案,它使用GroupBy.rank(方法=‘稠密’)方法
In [71]: df.loc[df.groupby('spin').Energy.rank(method='dense').le(1)]
Out[71]:
Energy spin
Particle 1 2 1
Particle 3 5 2
Particle 6 10 5
Particle 7 10 5解释:
In [72]: df.groupby('spin').Energy.rank(method='dense')
Out[72]:
Particle 1 1.0
Particle 2 2.0
Particle 3 1.0
Particle 4 2.0
Particle 5 2.0
Particle 6 1.0
Particle 7 1.0
Name: Energy, dtype: float64
In [73]: df.groupby('spin').Energy.rank(method='dense').le(1)
Out[73]:
Particle 1 True
Particle 2 False
Particle 3 True
Particle 4 False
Particle 5 False
Particle 6 True
Particle 7 True
Name: Energy, dtype: bool旧答案:
备选解决办法:
In [60]: df.sort_values('Energy').groupby('spin').head(1)
Out[60]:
Energy spin
Particle 1 2 1
Particle 3 5 2
Particle 6 10 5PS请注意,df.groupby('spin').Energy.nsmallest(1).reset_index(level=0)更惯用,应该表现得更好。
https://stackoverflow.com/questions/42731052
复制相似问题