首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过保持跨行子集的最小值,从旧中生成新的熊猫数据

通过保持跨行子集的最小值,从旧中生成新的熊猫数据
EN

Stack Overflow用户
提问于 2017-03-11 03:37:30
回答 2查看 61关注 0票数 2

我有表格的数据

代码语言:javascript
复制
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应该如下所示:

代码语言:javascript
复制
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

我尝试过不同的方法,但都失败了。做这件事最简单的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2017-03-11 03:43:51

您可以使用idxmin()来找出每个自旋能量最小的索引,然后使用它对原始数据帧进行子集(假设没有重复索引):

代码语言:javascript
复制
df.loc[df.groupby("spin").Energy.idxmin()]

另一种选择:使用nsmallest

代码语言:javascript
复制
df.groupby('spin').Energy.nsmallest(1).reset_index(level=0)

票数 3
EN

Stack Overflow用户

发布于 2017-03-11 09:04:19

更新:

源DF

代码语言:javascript
复制
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(方法=‘稠密’)方法

代码语言:javascript
复制
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

解释:

代码语言:javascript
复制
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

旧答案:

备选解决办法:

代码语言:javascript
复制
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     5

PS请注意,df.groupby('spin').Energy.nsmallest(1).reset_index(level=0)更惯用,应该表现得更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42731052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档