【问题标题】:Slicing within the groups of a DataFrameGroupBy object在 DataFrameGroupBy 对象的组内切片
【发布时间】:2019-12-01 09:52:44
【问题描述】:

Python 版本:3.7.3

here 提出了类似的问题,但并不完全相同。

基于一个条件,我想只检索 DataFrameGroupBy 对象的每组的一个子集。基本上,如果 DataFrame 以只有 NAN 的行开头,我想删除它们。如果不是这样,我希望整个 DataFrame 保持完整。为此,我编写了一个函数delete_rows

Grouped_object = df.groupby(['col1', 'col2']) 

def delete_rows(group):
  pos_min_notna = group[group['cumsum'].notna()].index[0]
  return group[pos_min_notna:]

new_df = Grouped_object.apply(delete_rows)

然而,这个函数似乎只为DataFrameGroupBy 对象中的第一组做“工作”。我错过了什么,所以它为所有组执行此操作并将子集“粘合”在一起?

函数 delete_rows 根据 Laurens Koppenol 提供的逻辑编辑

【问题讨论】:

  • 为什么不总是返回group[pos_min_notna:]?哪个是没有丢失的第一行,可能是组中的第一行(iloc 0)
  • 你说的完全正确,我确实应该这样做。因此,该功能可以简化为您的逻辑。但是,这样做后,它仍然只返回 DataFrameGroupBy 中第一组的数据。有什么建议吗?我显然在这里遗漏了一些东西,但找不到它
  • 不确定为什么它只适用于第一组,但如果您要求替代解决方案,您应该提供一个数据集。否则我们很难测试任何解决方案。
  • @Valentino 提供的答案有效。问题在于没有使用.loc

标签: python pandas dataframe subset slice


【解决方案1】:

在 Pandas 中,您必须非常小心索引 (loc) 和索引位置 (iloc)。明确这一点总是一个好主意。

This answer 对差异有一个很好的概述

Grouped_object = df.groupby(['col1', 'col2']) 

def delete_rows(group):
  pos_min_notna = group[group['cumsum'].notna()].index[0]  # returns value of the index = loc
  return group.loc[pos_min_notna:]  # make loc explicit

new_df = Grouped_object.apply(delete_rows)  # this dataframe has a messed up index :)

小例子 显示不受欢迎的行为

df = pd.DataFrame([[1,2,3], [2,4,6], [2,4,6]], columns=['a', 'b', 'c'])

# Drop the first row of every group
df.groupby('a').apply(lambda g: g.iloc[1:])

# Identical results as:
df.groupby('a').apply(lambda g: g[1:])

# Return anything from any group with index 1 or higher
# This is nonsense with a static index in a sorted df. But examples huh
df.groupby('a').apply(lambda g: g.loc[1:])


【讨论】:

  • 很好,只是为了我的理解。所以因为我没有明确指定lociloc,通过使用group[pos_min_notna:] 它使用iloc?您的解决方案完美运行,感谢您的帮助!
猜你喜欢
  • 2021-01-09
  • 2014-10-06
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
相关资源
最近更新 更多