python - pandas 按多列分组并选择前 n 行

标签 python pandas

我有一个具有以下结构的 Pandas DataFrame

file,page_num,val,cls
f1,1,v1,c1
f1,1,v2,c2
f1,1,v3,c2
f1,1,v4,c2     # not required
f1,2,v5,c1
f1,2,v6,c2
f2,1,v7,c1
f2,1,v8,c2
f2,1,v9,c2
f2,1,v10,c2    # not required
f2,2,v11,c1
f2,2,v12,c2

我需要为file<中的每个page_num找到clsc2的前。其他(cls)类应保持原样。

期望的输出

file,page_num,val,cls
f1,1,v1,c1
f1,1,v2,c2
f1,1,v3,c2
f1,2,v5,c1
f1,2,v6,c2
f2,1,v7,c1
f2,1,v8,c2
f2,1,v9,c2
f2,2,v11,c1
f2,2,v12,c2

我尝试选择除 c2 之外的所有类,然后使用以下命令查找 c2 所需的行。

df = pd.read_csv('sample_f.csv')

df1 = df[df.cls == 'c2'].groupby(['file', 'page_num'])
df2 = df1.apply(lambda x: x.sort_values(['cls']))
df3 = df2.reset_index(drop=True)

df = df.loc[(df.cls !=c2) & (??)]

最佳答案

您可以使用headgroupby ,然后与数据帧的其余部分连接,因此假设您需要找到前两个 val每组:

top_2 = (
    df[df['cls'] == 'c2']
    .sort_values('val', ascending=False)
    .groupby(['file', 'page_num'])
    .head(2)
    .reset_index()
)
rest = df[df['cls'] != 'c2']
final_df = pd.concat([top_2, rest])

(编辑:我添加了按 val 排序,因为从问题来看,尚不清楚数据帧是否已排序。)

关于python - pandas 按多列分组并选择前 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55887463/

相关文章:

python - Pandas - 对非日期时间重新采样

python-3.x - 如果第 1 列未产生匹配项,则 Pandas 会在第 2 列上合并

python - django-1.8 : "XXXView"object has no attribute 'add_error'

python - 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

python - 如何根据二级标准从多索引 pandas.Series 对象中提取?

python - 如果值小于 Pandas 数据框系列中的先前值

python - 在给定日期对 Python 系列或数据帧重新采样

python - 使用PeriodIndex对pandas系列进行切片

python - Imshow:范围和方面

python - 为什么 `(True, True, True) == True, True, True` 在 Python 中不是 True?