python - 有问题的 DataFrame 切片?

标签 python pandas dataframe

这个问题是我之前在这里发布的一个问题的续集: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) })

df

我的问题的解决方案是这个,它似乎工作得很好:

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)))

enter image description here

我同意,第 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)))

不幸的是,它没有:

enter image description here

这里最引人注目的一点是第 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/

相关文章:

python - 在 pandas dataframe 中随机引入 NaN 值

python - 如何左对齐 pandas `to_string()` 中的列值?

python - 使用python删除excel文件中的NA行

python - 在 pytorch 中使用双线性插值移动图像

python - 如何从字符串中删除所有尾随破折号?

Python 3.8 列表理解中的赋值表达式

python - 在 Pandas 表中插入链接

r - 使用 dplyr 根据其他列的值更改列的内容

r - 从数据框中的两个字符类型行的组合创建一个新行

python - 在 plt 之外设置 matplotlib 颜色图的限制