这个问题是我之前在这里发布的一个问题的续集: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。怎么会?是不是选法不对?我该如何纠正?
非常感谢
最佳答案
您收到此错误是因为 x.sort_values('R').iloc[3]
正在对 DataFrame 而不是仅由列 R
组成的系列进行排序。这意味着当您调用 np.any
时,它会检查任何列,包括列 Group
以查看它是否大于 R_min
和因为 Group
的所有值都是正数,所以这将返回 true。
您的代码也不是最理想的。你应该这样做:
R_min = -18.8
df.groupby('Group').filter(lambda x: (x.shape[0] >= 4) & (x['R'].nsmallest(4).iloc[-1] <= R_min))
关于python - 有问题的 DataFrame 切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649242/