我有一个带有以太坊事务和相关内部执行调用的数据框架.数据如下所示:

  [
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x45ae5ae57a0f4e6250f782fc6f0daec5dead27e4",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "createEstateWithMetadata",
"ORDER_INDEX": 3859
},
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "createEstateWithMetadata",
"ORDER_INDEX": 3861
},
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "0_0",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"TO_ADDRESS": "0x959e104e1a4db6317fa58f8295f586e1a978c297",
"FUNCTION_NAME": "mint",
"ORDER_INDEX": 3863
},
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "0_0_0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0x959e104e1a4db6317fa58f8295f586e1a978c297",
"TO_ADDRESS": "0x1784ef41af86e97f8d28afe95b573a24aeda966e",
"FUNCTION_NAME": "mint",
"ORDER_INDEX": 3866
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-11 19:03:09.000",
"TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x3b38a52998a4b786638e774007f3f8ab34db792e",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "setApprovalForAll",
"ORDER_INDEX": 1620
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-11 19:03:09.000",
"TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "approve",
"ORDER_INDEX": 1622
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-12 20:08:20.000",
"TX_HASH": "0xbcbadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712c",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x3b38a52998a4b786638e774007f3f8ab34db792e",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "setApprovalForAll",
"ORDER_INDEX": 1620
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-12 20:08:20.000",
"TX_HASH": "0xbcbadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712c",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "approve",
"ORDER_INDEX": 1622
}
]

具有相同TX_HASH值的记录属于相同的执行轨迹.其中,CALL_ID = \\N代表事务(etherscan),其他代表内部调用.在内部调用记录上,CALL_ID字段可以获得00_00_10_0_00_1_0等值...下划线后的每个数字表示执行跟踪中的更深层次.\\N号记录为实际交易,其他记录表示智能合约在执行期间内部执行的功能.

在数据框架内,有数千个不同的事务,因此有数千个不同的TX_HASH个值.对于每个不同的哈希值,可以有1个或多个表示内部调用的记录.

此外,从数据示例中可以看到,还有一个FUNCTION_NAME表示智能合约执行的功能.\\N表示顶层功能,00_0表示内部功能.

我需要做的是 for each 顶级FUNCTION_NAME创建不同的数据帧,这意味着在CALL_ID = \\N的记录上每个不同的FUNCTION_NAME值.考虑到上面的createEstateWithMetadata,应该有一个包含FUNCTION_NAME = createEstateWithMetadataCALL_ID = \\N记录的数据帧,然后考虑到这些记录的哈希,我们需要识别内部调用(它们具有相同的哈希),并将它们添加到数据帧中.

例如,createEstateWithMetadata的数据框应该包含上面的数据样本中包含的记录.在初始数据帧中,FUNCTION_NAMECALL_ID = \\N有20多个不同的值.下面的setApprovalForAll是一个示例,它将导致一个新的数据帧:

  {
    "BLOCK": 12019039,
    "TIMESTAMP": "2021-03-11 19:03:09.000",
    "TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
    "CALL_ID": "\\N",
    "CALL_TYPE": "call",
    "FROM_ADDRESS": "0x3b38a52998a4b786638e774007f3f8ab34db792e",
    "TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
    "FUNCTION_NAME": "setApprovalForAll",
    "ORDER_INDEX": 1620
  },
  {
    "BLOCK": 12019039,
    "TIMESTAMP": "2021-03-11 19:03:09.000",
    "TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
    "CALL_ID": "0",
    "CALL_TYPE": "delegatecall",
    "FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
    "TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
    "FUNCTION_NAME": "approve",
    "ORDER_INDEX": 1622
  }

我的 idea 是先按TX_HASH分组以获得执行的"跟踪",然后获得每组第一条记录的FUNCTION_NAME值(应该是CALL_ID = \\N),以创建数据帧,并迭代地将每个组放入正确的数据帧中.我相信这可能是解决办法.

推荐答案

这似乎可以做到:创建一个新列,其中CALL_ID等于"\\N",然后按TX_HASH分组,并将TX_HASH映射到新创建列的第一个值.(因为每TX_HASH只能有一个CALL_ID=="\\N".

df["NEW_HASH_GROUP"] = (df.CALL_ID == "\\N") * df.FUNCTION_NAME
df["GROUP"] = df.TX_HASH.map(df.groupby("TX_HASH").NEW_HASH_GROUP.first())

# Split each group in its own DataFrame
dfs = [f for _, f in df.groupby(["GROUP"])]

如果我这样做:

for df in dfs:
    print(df.GROUP.unique())

# ['createEstateWithMetadata']
# ['setApprovalForAll']

Python相关问答推荐

Django:如何将一个模型的唯一实例创建为另一个模型中的字段

Pandas 密集排名具有相同值,按顺序排列

流畅的模式,采用Escc方法

为什么我的主页不会重定向到详细视图(Django)

Python在通过Inbox调用时给出不同的响应

已安装' owiener ' Python模块,但在导入过程中始终没有名为owiener的模块

两极:如何分割一个大 pyramid 并并行保存每个

已删除的构造函数调用另一个构造函数

ambda将时间戳与组内另一列的所有时间戳进行比较

Python中MongoDB的BSON时间戳

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

Polars:用氨纶的其他部分替换氨纶的部分

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

django禁止直接分配到多对多集合的前端.使用user.set()

如何创建一个缓冲区周围的一行与manim?

多处理队列在与Forking http.server一起使用时随机跳过项目

python中的解释会在后台调用函数吗?

判断solve_ivp中的事件

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题