如何基于另一列值筛选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
相关产品推荐
相关产品推荐

