如何在Pandas DataFrame中筛选值为True的行并生成指定结构的字典
嘿,我来帮你搞定这两个需求,直接上代码和清晰的解释:
功能1:筛选DataFrame中值为True的行
根据你的DataFrame列数不同,分几种情况处理:
针对单一布尔列筛选:假设你的布尔列叫
flag,直接用布尔索引就能快速筛选:import pandas as pd # 示例DataFrame df = pd.DataFrame({'flag': [True, False, True, False], 'other_col': [1,2,3,4]}) # 筛选flag列为True的行 true_rows = df[df['flag']] print(true_rows)任意一列存在True就筛选:如果你的DataFrame有多列,只要某一行任意一列是True就保留:
true_rows = df[df.any(axis=1)]所有列都为True才筛选:只有当行内所有列的值都是True时才保留:
true_rows = df[df.all(axis=1)]
功能2:生成指定结构的字典
核心逻辑是先找到所有True行的位置,然后以这些位置为分割点,生成从True行下一个数字开始的子列表,直到下一个True行的前一个数字。
以下是完整实现代码,完全匹配你给出的示例结构:
import pandas as pd # 先构造一个符合示例逻辑的DataFrame(模拟你的PDF表格数据) # 假设True行的位置是行1、6、17、21、30(对应示例子列表的分割点) row_count = 34 flag_list = [False]*row_count # 设置True的位置(行号从1开始) true_positions = [1,6,17,21,30] for pos in true_positions: flag_list[pos-1] = True # 转换为0-based索引 df = pd.DataFrame({'flag': flag_list}, index=range(1, row_count+1)) # 行号从1开始 # 步骤1:获取所有True行的行号 true_row_nums = df[df['flag']].index.tolist() # 步骤2:添加最后一行的下一个行号作为结束标记,确保最后一个子列表能覆盖到末尾 true_row_nums.append(df.index[-1] + 1) # 步骤3:生成子列表 sublists = [] for i in range(len(true_row_nums)-1): start_num = true_row_nums[i] + 1 end_num = true_row_nums[i+1] # 生成从start_num到end_num-1的连续数字列表 sublist = list(range(start_num, end_num)) sublists.append(sublist) # 步骤4:构造目标字典 pandas_dict = {0: sublists} print(pandas_dict)
运行这段代码后,输出的字典就和你给出的示例完全一致:
{0: [[2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]}
关键逻辑说明:
- 我们把行号设为从1开始(匹配你示例中的数字序列),如果你的DataFrame是默认0-based索引,只需要把
index=range(1, row_count+1)去掉,然后调整true_positions为0-based索引即可。 - 添加
df.index[-1] + 1作为最后一个分割点,是为了确保最后一个子列表能覆盖到DataFrame的最后一行。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

