如何对不同长度的 Python Pandas groupby 对象进行切片?

Posted

技术标签:

【中文标题】如何对不同长度的 Python Pandas groupby 对象进行切片?【英文标题】:How to slice Python Pandas groupby objects with various lengths? 【发布时间】:2021-12-02 19:37:15 【问题描述】:

创建数据框:

df = pd.DataFrame('Set': [1, 1, 1, 2, 2, 2, 2, 2], 'Value': [1, 2, 3, 1, 2, 3, 4, 5])

DataFrame 中的结果如下所示。

接下来我通过Set进行groupby操作,第一组如下图。

grouped_by_Set = df.groupby('Set')
grouped_by_Set.get_group(1)

现在我想在每个组的 Value 列中选择除最后一个条目之外的所有条目。我可以使用grouped_by_Set.nth([0, 1, 2])grouped_by_Set.nth(-1) 选择每个组的前三个(例如)和最后一个条目,但是选择除每个组的最后一个条目之外的所有条目不适用于grouped_by_Set.nth(0:-1)。由于组的长度不同,我无法明确指定条目。

【问题讨论】:

请张贴预期的输出数据框 【参考方案1】:

IIUC,您可以在apply 中使用iloc

print(df.groupby('Set').apply(lambda x: x.iloc[:-1]).reset_index(drop=True))
   Set  Value
0    1      1
1    1      2
2    2      1
3    2      2
4    2      3
5    2      4

或者您可以使用duplicated 和keep='last' 创建一个掩码,然后将此掩码与loc 一起使用

print(df.loc[df.duplicated(subset='Set', keep='last')])
   Set  Value
0    1      1
1    1      2
3    2      1
4    2      2
5    2      3
6    2      4

【讨论】:

【参考方案2】:

您可以使用tail(1) 获取每个组的最后一个条目,然后使用索引通过反转isin 从原始数据帧中取消选择它:

df[~df.index.isin(df.groupby("Set").tail(1).index)]

# Output:
    Set Value
0   1   1
1   1   2
3   2   1
4   2   2
5   2   3
6   2   4

【讨论】:

【参考方案3】:

使用reset_index(drop=True) + .max() 方法试试这个,想法是使用每个组的索引来设置切片操作的开始和结束:

grouped_by_Set = df.groupby('Set')
group = grouped_by_Set.get_group(1).reset_index(drop=True)
start = group.index[0]
end = group.index.max()
df_output = group.iloc[start:end, :]
print(df_output)

输出:

第 1 组:

Set Value
0 1 1
1 1 2

第 2 组:

Set Value
0 2 1
1 2 2
2 2 3
3 2 4

【讨论】:

以上是关于如何对不同长度的 Python Pandas groupby 对象进行切片?的主要内容,如果未能解决你的问题,请参考以下文章

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

python--pandas分组聚合

python使用pandas通过聚合获取时序数据的最后一个指标数据(例如长度指标时间指标)生成标签并与原表连接(join)进行不同标签特征的可视化分析

python - 如何按python中的因子级别对pandas数据框中的行进行重新排序?

pandas中如何对指定列做fillna

pandas截取字符串固定长度