【问题标题】:A bugged DataFrame slicing?错误的 DataFrame 切片?
【发布时间】: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。怎么会?选择方法错了吗?应该怎么改?

非常感谢

【问题讨论】:

  • 那个链接的帖子是我回答的。既然你已经指出了,那里面就有一个小错误。我已经更新了该帖子并进行了必要的更改。

标签: python pandas dataframe


【解决方案1】:

您收到此错误是因为 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))

【讨论】:

  • 完美!非常感谢!由于我的实际星系组目录中有很多字段,这意味着我的选择是错误的。您的代码完美运行,并且比以前的代码更易于阅读。再次感谢您!
  • 另外,你的解释很清楚,帮助我提高。 :)
猜你喜欢
  • 2018-06-17
  • 2017-12-11
  • 2017-03-28
  • 2013-09-01
  • 2012-08-06
  • 2017-08-22
  • 2021-08-09
  • 1970-01-01
  • 2018-03-08
相关资源
最近更新 更多