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

如何移除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就是你想要的结构:

NAMEQ1Q2Q3Q4
0SELL1111
1TRADE2222
2BUY3333
3TRADE4444

第二步:按需求取出目标行(避免重复)

你想要的是按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的行,也能准确按顺序取出。

最终结果

运行上面的代码后,你会得到完全符合预期的无重复结果:

NAMEQ1Q2Q3Q4
0SELL1111
1TRADE2222
2BUY3333
3TRADE4444

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:12:33