You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列值筛选Pandas行列?及按ticker取最小值去重

嘿,我来帮你搞定这两个Pandas的问题,都是日常数据处理里的高频场景,咱们一步步拆解:

1. 基于另一列的值筛选Pandas的行或列

筛选行(最常用场景)

这是处理数据时最常见的需求,用布尔索引就能轻松实现。比如你想筛选diff列小于-50的行,或者ticker等于"AA"的行,示例代码如下:

import pandas as pd

# 假设你的数据集存储在df中
# 筛选diff < -50的所有行
filtered_rows = df[df['diff'] < -50]

# 筛选ticker为"AA"的所有行
aa_rows = df[df['ticker'] == "AA"]

# 多条件组合筛选(比如diff < -60 且 date0早于2016-12-01)
# 先把日期列转成datetime类型,才能正确比较
df['date0'] = pd.to_datetime(df['date0'])
multi_condition_rows = df[(df['diff'] < -60) & (df['date0'] < pd.to_datetime("2016-12-01"))]

基于另一列筛选列

这种场景相对少见,但也有实用的实现方式:

  • 方式一:根据列的值特征筛选。比如保留所有列中至少包含"ART"值的列(针对你的dim列):
filtered_cols = df.loc[:, df.eq("ART").any()]
  • 方式二:根据列的统计值筛选。比如保留数值列中均值大于-70的列:
# 先筛选出所有数值类型的列
numeric_cols = df.select_dtypes(include='number').columns
# 筛选均值大于-70的数值列
qualified_cols = numeric_cols[df[numeric_cols].mean() > -70]
# 提取结果
result = df[qualified_cols]
2. 基于ticker分组,按最小值(整数/日期)去重

看你的数据集,核心需求是按ticker分组后,保留每组中满足「最小值」条件的行——这里的最小值可能指整数diff的最小值,或者日期date0/date1的最早日期,我分几种常见情况给你解法:

第一步:数据预处理

先把日期列转成datetime类型,确保能正确比较日期大小,同时保证diff是整数类型:

df['date0'] = pd.to_datetime(df['date0'])
df['date1'] = pd.to_datetime(df['date1'])
df['diff'] = df['diff'].astype(int)

情况1:保留每个ticker中diff最小的行

如果想保留每组中diff最负(数值最小)的行,有两种实现方式:

  • 方式一:只保留每组第一个出现最小值的行:
# 获取每组diff最小的行的索引
min_diff_idx = df.groupby('ticker')['diff'].idxmin()
# 提取结果
result = df.loc[min_diff_idx]
  • 方式二:保留所有diff等于组内最小值的行(比如AA组有两行diff都是-131,都保留):
# 计算每个ticker组的最小diff值
min_diff_per_ticker = df.groupby('ticker')['diff'].transform('min')
# 筛选出diff等于组内最小值的行
result = df[df['diff'] == min_diff_per_ticker]

情况2:保留每个ticker中date0最早的行

如果需求是保留每组中最早的date0对应的行:

  • 方式一:只保留第一个出现最早日期的行:
# 获取每组date0最早的行的索引
earliest_date0_idx = df.groupby('ticker')['date0'].idxmin()
result = df.loc[earliest_date0_idx]
  • 方式二:保留所有date0等于组内最早日期的行:
# 计算每个ticker组的最早date0
earliest_date0_per_ticker = df.groupby('ticker')['date0'].transform('min')
# 筛选出date0等于组内最早日期的行
result = df[df['date0'] == earliest_date0_per_ticker]

情况3:组合条件(先按diff最小,再按date0最早)

如果想优先保留diff最小的行,当diff相同时,再保留date0最早的行:

# 按ticker升序、diff升序(最小值在前)、date0升序(最早在前)排序
df_sorted = df.sort_values(by=['ticker', 'diff', 'date0'], ascending=[True, True, True])
# 按ticker去重,保留第一个符合条件的行
result = df_sorted.drop_duplicates(subset='ticker', keep='first')

内容的提问来源于stack exchange,提问作者michael0196

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:14:21