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

如何合并含重复键的两个DataFrame?将重复项转为字典列表列

解决方案:合并DataFrame并将多记录转为字典列表列

实现思路

  1. 先对动物数据(第二个DataFrame)做预处理:保留需要的字段(id、inc、string_1、number1),按id分组后,把每组的每条记录转换成字典,再聚合为字典列表。
  2. 将处理后的动物数据与主人数据(第一个DataFrame)通过id做左连接,把字典列表作为新列Animals添加进去。

完整代码示例

import pandas as pd

# 创建第一个DataFrame(主人数据)
df_owners = pd.DataFrame({
    'Timestamp': ['2022-11-28 21:28:20.793', '2022-11-28 21:28:20.793'],
    'type': ['Owner', 'Owner'],
    'id': [7249, 7250],
    'Address': ['"8675 Jenny Lane, City, State, Zip"', '"309 Jenny Court, City, State, Zip"']
})

# 创建第二个DataFrame(动物数据)
df_animals = pd.DataFrame({
    'Timestamp': ['2022-11-28 21:28:20.793']*5,
    'type': ['Animal']*5,
    'id': [7249,7249,7249,7249,7250],
    'inc': [0,1,2,3,0],
    'string_1': ['cat1','cat2','dog1','mouse1','mouse2'],
    'number1': [3121435,3121435,3121558,3121559,3121435]
})

# 处理动物数据:按id分组,生成字典列表
df_animals_processed = df_animals[['id', 'inc', 'string_1', 'number1']].groupby('id')\
    .apply(lambda x: x.drop('id', axis=1).to_dict('records'))\
    .reset_index(name='Animals')

# 合并两个DataFrame
result_df = pd.merge(df_owners, df_animals_processed, on='id', how='left')

# 查看结果
print(result_df)

运行结果

Timestamp   type    id                             Address                                                                 Animals
0  2022-11-28 21:28:20.793  Owner  7249  "8675 Jenny Lane, City, State, Zip"  [{'inc': 0, 'string_1': 'cat1', 'number1': 3121435}, {'inc': 1, 'string_1': 'cat2', 'number1': 3121435}, {'inc': 2, 'string_1': 'dog1', 'number1': 3121558}, {'inc': 3, 'string_1': 'mouse1', 'number1': 3121559}]
1  2022-11-28 21:28:20.793  Owner  7250  "309 Jenny Court, City, State, Zip"  [{'inc': 0, 'string_1': 'mouse2', 'number1': 3121435}]

补充说明

如果需要保留字典里的id字段,只需去掉处理代码中的drop('id', axis=1)即可,生成的字典会包含id键值对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:00:55