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

如何用Pandas为以太坊欺诈检测数据集按规则生成账户Flag列

解决Pandas实现以太坊欺诈检测数据集的test_account标记问题

原代码的问题点

你的循环写法存在几个关键错误:

  1. 索引错误:test_account[i]['flag']和train_account[i]['flag']的写法不符合Pandas索引规则,不能直接用账户名作为DataFrame的行索引来赋值。
  2. 拼写错误:trasnaction应该是transactions。
  3. 逻辑错误:elif i in trasnaction['from_account'] or trasnaction['to_account']的条件逻辑错误,后半部分trasnaction['to_account']会直接判断该列是否非空,而非判断i是否在该列中,正确写法应该是i in transactions['from_account'] or i in transactions['to_account']。
  4. 效率问题:Pandas不推荐用循环遍历行处理,内置的矢量化操作效率更高。

正确实现步骤(不增删行,仅添加flag列)

1. 读取数据

首先读取三个CSV文件:

import pandas as pd

# 读取数据
train_account = pd.read_csv('train_account.csv')
transactions = pd.read_csv('transactions.csv')
test_account = pd.read_csv('test_account.csv')

2. 从训练集映射flag值

先通过map方法,将train_account中已有的账户flag值映射到test_account中,未匹配到的会自动设为NaN:

# 先创建训练集账户到flag的映射字典
account_flag_map = train_account.set_index('account')['flag'].to_dict()
# 映射到测试集,生成flag列
test_account['flag'] = test_account['account'].map(account_flag_map)

3. 处理未在训练集中的账户

先收集交易记录中所有出现过的账户(合并from和to列),然后对flag为NaN的行进行判断:

# 收集所有交易中出现过的账户
transaction_accounts = set(transactions['from_account'].tolist() + transactions['to_account'].tolist())

# 对未匹配到训练集的账户,根据交易记录标记flag
test_account['flag'] = test_account.apply(
    lambda row: 0 if row['account'] in transaction_accounts else 1 
    if pd.isna(row['flag']) 
    else row['flag'],
    axis=1
)

4. 保存结果

最后将处理后的结果保存为新的CSV:

test_account.to_csv('test_account_with_flag.csv', index=False)

验证结果

运行后得到的test_account_with_flag.csv内容与期望输出一致:

accountflag
a278901
a036831
a221460

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:10:51