如何在Pandas中选取分组后DataFrame的每组首行
嘿,我来帮你搞定这个需求!要对DataFrame按列分组后选取每组的首行,Pandas提供了好几种实用的方法,下面结合你的数据详细演示:
首先先确认你的DataFrame构造(修正了原输出里的小错误,确保数据准确):
import pandas as pd df = pd.DataFrame([ [1, 1, 2, 2, 2, 3,4,5,5,5,6,6,6,6], list('AABBBCDEEEFFFF'), [1,2,3,4,5,6,7,8,9,10,11,12,13,14], [1,2,3,4,5,6,7,8,9,11,12,11,11,11] ]).T df.columns = ['col1','col2','col3','col4']
方法1:用groupby().first()提取每组首条有效数据
这个方法会返回每组中各列的第一个非空值,适合你需要提取组内首条有效记录的场景:
# 按col1分组,取每组首行 result_first = df.groupby('col1').first() print(result_first)
如果需要按多列(比如col1+col2)分组,只要把分组列放进列表即可:
result_multi_first = df.groupby(['col1', 'col2']).first() print(result_multi_first)
方法2:用groupby().head(1)保留原行结构
这个方法会直接返回每组的第一行原始数据,并且保留原DataFrame的行索引,适合需要保留原行上下文的场景:
result_head = df.groupby('col1').head(1) print(result_head)
方法3:用groupby().nth(0)灵活选取指定行
nth(0)和head(1)类似,但它能更灵活地选择组内的第N行(这里0代表首行),还能处理重复索引的情况:
# 默认返回分组键作为索引 result_nth = df.groupby('col1').nth(0) print(result_nth) # 如果想保留原行索引,设置keep_index=True result_nth_keep_idx = df.groupby('col1').nth(0, keep_index=True) print(result_nth_keep_idx)
三种方法的小区别
first():自动忽略NaN值,取每组该列的第一个非空值;结果索引为分组键。head(1):返回原DataFrame的完整行,保留原索引,哪怕该行包含NaN也会返回。nth(0):严格选取组内的第0行(遵循原数据顺序),包含NaN也会保留;可通过参数控制是否保留原索引。
内容的提问来源于stack exchange,提问作者gabboshow
相关产品推荐
相关产品推荐

