【发布时间】:2017-05-29 16:32:22
【问题描述】:
这个问题是我在此处发布的前一个问题的续集:Slicing Pandas Dataframe according to number of lines。我有很好的答案解决了这个问题。然而,当以不同的方式尝试解决方案时,我没有得到我所期望的结果,尽管进行了多次测试,但我不明白为什么。
假设我有一个 pandas 数据框 df,其中包含一个“组”ID(一个组中当然可以有很多对象)和一个数量,比如“R”。我想构造另一个包含至少 4 个对象的组的 df,并且第 4 个对象在按 R 排序时低于 R_min(我知道调用最大值“R_min”听起来很奇怪,但它们是星系的大小,它为负值,越低越亮 - 或绝对值越高越亮)。这是为该问题构建的模拟 DataFrame:
df = pd.DataFrame({ 'R' : (-21,-21,-22,-3,-23,-24,-20,-19,-34,-35,-30,-5,-25,-6,-7,-22,-21,-10,-11,-12,-13,-14,-15),
....: 'Group': (1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5) })
我的问题的解决方案是这个,它似乎工作得很好:
R_min = -18.8
df_processed = (df[df.Group.map(df.Group.value_counts().ge(4))]
.groupby('Group').filter(lambda x: np.any(x.sort_values('R').iloc[3] <= R_min)))
我同意,第 3 组是唯一受我约束的组。现在,为了验证并了解我的星系组目录是如何构建的,我检查了那些至少有四个成员的人中剩下的那些。我希望像下面这样的代码能够完全一样地工作:
df_left = (df[df.Group.map(df.Group.value_counts().ge(4))]
.groupby('Group').filter(lambda x: np.any(x.sort_values('R').iloc[3] > R_min)))
不幸的是,它没有:
这里最引人注目的一点是第 3 组也在 df_left 中!按 R 排序,第 3 组给出 -35、-34、-30、-19、-5,其中第 4 个值为 -19,低于 -18.8。怎么会?选择方法错了吗?应该怎么改?
非常感谢
【问题讨论】:
-
那个链接的帖子是我回答的。既然你已经指出了,那里面就有一个小错误。我已经更新了该帖子并进行了必要的更改。