在DataFrameGroupBy对象的组内切片

2024-09-20 04:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

Python版本:3.7.3

有人问了类似的问题,但不完全相同。你知道吗

根据一个条件,我只想检索DataFrameGroupBy对象的每个组的一个子集。基本上,如果一个数据帧以只有nan的行开始,我想删除它们。如果不是这样,我希望整个数据帧保持完整。为此,我编写了一个函数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提供的逻辑编辑


Tags: 数据对象函数pos版本dfobjectgroup
1条回答
网友
1楼 · 发布于 2024-09-20 04:01:37

在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:])


相关问题 更多 >