合并含重复索引的DataFrame与分组Series及分组查询方法
问题
需要将以下df1与series_object进行合并,具体要求及数据如下:
df1数据
wallet cumulative_rewards position position_rewards position_type 0 0x12345 0 LUSD 1000 LP Pair 0 0x12345 0 TOKE 200 LP Token 1 0xabcde 0 UNI_LP 500 LP 1 0xabcde 0 SUSHI_LP 0 LP 1 0xabcde 0 DAI 100 LP Pair
series_object数据
该对象由grouped_toke_transfers = toke_transfers_df.groupby('from_address')['value'].sum()生成,索引为from_address,数据如下:
from_address value 0x12345 13687137402763990447827 0xabcde 58950104860666120622 0xfghij 3491287228881431880579 0xklmno 1260986666816869789
合并要求
- 保留df1中重复出现的钱包(即重复索引对应的钱包);
- 将series_object中对应钱包的value添加到每一行,同一钱包的所有行value值相同;
- 合并后的DataFrame不包含df1中在series_object里不存在的钱包。
额外需求
基于合并后的表格,如何使用groupby()根据position_type查询对应的value?
解决方案
一、合并DataFrame与Series
先将Series转换为DataFrame并对齐列名,再用内连接完成合并,既保留df1的重复行,又自动过滤掉series中不存在的钱包:
import pandas as pd # 将Series转为DataFrame,并重命名索引列为'wallet',和df1的列名匹配 series_df = grouped_toke_transfers.reset_index().rename(columns={'from_address': 'wallet'}) # 执行内连接合并 merged_df = pd.merge(df1, series_df, on='wallet', how='inner')
合并后merged_df的结构示例(符合所有要求):
wallet cumulative_rewards position position_rewards position_type value 0 0x12345 0 LUSD 1000 LP Pair 13687137402763990447827 1 0x12345 0 TOKE 200 LP Token 13687137402763990447827 2 0xabcde 0 UNI_LP 500 LP 58950104860666120622 3 0xabcde 0 SUSHI_LP 0 LP 58950104860666120622 4 0xabcde 0 DAI 100 LP Pair 58950104860666120622
二、按position_type分组查询value
根据实际需求选择对应的聚合方式:
1. 统计每个position_type对应的value总和
如果需要将同一类型下所有钱包的value相加:
type_value_sum = merged_df.groupby('position_type')['value'].sum().reset_index()
2. 获取每个position_type对应的唯一value(去重)
如果同一position_type下的value不重复,或者只需要保留每个类型下的不同value:
# 取每个分组的第一个value type_unique_value = merged_df.groupby('position_type')['value'].first().reset_index() # 或者返回该类型下所有唯一value的列表 type_unique_values = merged_df.groupby('position_type')['value'].unique().reset_index()
3. 查看每个position_type对应的所有value明细
如果需要保留每个类型下的全部value记录:
type_value_details = merged_df.groupby('position_type')['value'].apply(list).reset_index()
内容的提问来源于stack exchange,提问作者Luiz Scheuer
相关产品推荐
相关产品推荐

