如何用Pandas为以太坊欺诈检测数据集按规则生成账户Flag列
解决Pandas实现以太坊欺诈检测数据集的test_account标记问题
原代码的问题点
你的循环写法存在几个关键错误:
- 索引错误:
test_account[i]['flag']和train_account[i]['flag']的写法不符合Pandas索引规则,不能直接用账户名作为DataFrame的行索引来赋值。 - 拼写错误:
trasnaction应该是transactions。 - 逻辑错误:
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']。 - 效率问题: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内容与期望输出一致:
| account | flag |
|---|---|
| a27890 | 1 |
| a03683 | 1 |
| a22146 | 0 |
内容的提问来源于stack exchange,提问作者Jeevan Lenka
相关产品推荐
相关产品推荐

