如何解决对于每个类别,如何查找与另一列最小值对应的一列值?
我有一张看起来像这样的桌子;它是交叉表的堆叠版本,因此项目和期间的每种组合都是唯一的:
+------+--------+-------+
| item | period | value |
+------+--------+-------+
| x | 1 | 6 |
| x | 2 | 4 |
| x | 3 | 5 |
| y | 1 | 9 |
| y | 2 | 10 |
| y | 3 | 100 |
+------+--------+-------+
对于每个项目,我需要找到价值最低的时段,因此所需的结果是:
+------+--------+-------+
| item | period | value |
+------+--------+-------+
| x | 2 | 4 |
| y | 1 | 9 |
+------+--------+-------+
我研究了pandas.DataFrame.idxmin(),但这似乎不是我所需要的。 我已经找到了使用groupby,min和merge的方法,但是我想知道是否还有更优雅的解决方案?
我发现了许多与R和SQL相关的类似问题(我的解决方案实际上是“ SQLish”,而不是Python
我的解决方法是:
import numpy as np
import pandas as pd
df = pd.DataFrame()
df['item'] = np.repeat(['x','y'],3)
df['period'] = np.tile( [1,2,3],2 )
df['value'] = [6,4,5,9,10,100]
min_value = df[['item','value']].groupby('item').min().reset_index(drop = False)
periods_with_min_value = pd.merge(min_value,df,how ='inner',on=['item','value'])
解决方法
df.loc[df.groupby("item")["value"].idxmin()]
Out[12]:
item period value
1 x 2 4
3 y 1 9
在pandas 1.1.3,python 3.7,debian 10 64位上进行了测试。没有发出警告。
如果索引值重复或损坏,则此解决方案将不起作用。可以提前.reset_index(drop=True)
解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。