如何移除Pandas中字典生成列表内的重复TRADE行?
解决Pandas中重复TRADE行的问题
嘿,作为Python和Pandas新手,遇到这种重复行的问题确实挺闹心的,我来帮你拆解清楚问题,再给你好用的解决方案~
先说说你代码里的核心问题
你的computeTable函数生成DataFrame的逻辑跑偏了,这是后续出现重复行的根源:
- 你本来想生成4行5列的表格(每行对应SELL/TRADE/BUY/TRADE,每列是NAME/Q1-Q4),但当前代码是把每个列的4个值挨个追加到
table_list里,最后得到的是一个20个元素的一维列表,转成DataFrame后是20行1列的奇怪结构,完全不是你想要的格式。 - 后面遍历
table2时,每次匹配NAME == 'TRADE'会把所有TRADE行(共2行)都取出来,循环两次'TRADE'就会把这两行各加一遍,结果自然就重复了。
修正步骤 + 去重解决方案
第一步:先把表格生成逻辑改对
咱们先把computeTable改成能生成正确4行5列表格的写法,这样后续操作才有意义:
import pandas as pd def computeTable(): cols = ['NAME', 'Q1', 'Q2', 'Q3', 'Q4'] # 直接构建每行的数据,对应你想要的SELL/TRADE/BUY/TRADE四行 table_data = [ {'NAME': 'SELL', 'Q1': 1, 'Q2': 1, 'Q3': 1, 'Q4': 1}, {'NAME': 'TRADE', 'Q1': 2, 'Q2': 2, 'Q3': 2, 'Q4': 2}, {'NAME': 'BUY', 'Q1': 3, 'Q2': 3, 'Q3': 3, 'Q4': 3}, {'NAME': 'TRADE', 'Q1': 4, 'Q2': 4, 'Q3': 4, 'Q4': 4} ] table_df = pd.DataFrame(table_data, columns=cols) return table_df compute_table = computeTable() compute_table = compute_table.fillna(0)
运行后compute_table就是你想要的结构:
| NAME | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| 0 | SELL | 1 | 1 | 1 | 1 |
| 1 | TRADE | 2 | 2 | 2 | 2 |
| 2 | BUY | 3 | 3 | 3 | 3 |
| 3 | TRADE | 4 | 4 | 4 | 4 |
第二步:按需求取出目标行(避免重复)
你想要的是按table2 = ['SELL', 'TRADE', 'BUY', 'TRADE']的顺序取出对应行——第一个TRADE取第1行,第二个TRADE取第3行,而不是每次把所有TRADE行都拉进来。这里有两种简单方法:
方法1:直接按行索引取(最直观)
如果你明确知道目标行的索引,直接指定就行,简单粗暴还准确:
table2 = ['SELL', 'TRADE', 'BUY', 'TRADE'] # 对应目标行的索引是0、1、2、3 table_list2 = compute_table.loc[[0, 1, 2, 3], :].reset_index(drop=True) print(table_list2)
这种方法适合你已经清楚每个元素对应哪一行的情况,结果完全符合你的需求,没有重复。
方法2:跟踪每个NAME的出现次数(更灵活)
如果不确定行索引,想根据table2的顺序自动匹配每个NAME的第n次出现,可以用计数器来实现:
from collections import defaultdict table2 = ['SELL', 'TRADE', 'BUY', 'TRADE'] counts = defaultdict(int) # 记录每个NAME已经取了几次 table_list2 = [] for name in table2: counts[name] += 1 # 取出当前NAME的第counts[name]次出现的行 target_row = compute_table[compute_table['NAME'] == name].iloc[counts[name]-1] table_list2.append(target_row) # 转成DataFrame并重置索引,让结果更整洁 table_list2 = pd.DataFrame(table_list2).reset_index(drop=True) print(table_list2)
这种方法更通用,哪怕你的表格里有更多重复NAME的行,也能准确按顺序取出。
最终结果
运行上面的代码后,你会得到完全符合预期的无重复结果:
| NAME | Q1 | Q2 | Q3 | Q4 | |
|---|---|---|---|---|---|
| 0 | SELL | 1 | 1 | 1 | 1 |
| 1 | TRADE | 2 | 2 | 2 | 2 |
| 2 | BUY | 3 | 3 | 3 | 3 |
| 3 | TRADE | 4 | 4 | 4 | 4 |
内容的提问来源于stack exchange,提问作者Woody
相关产品推荐
相关产品推荐

