【问题标题】:Merge multiple rows from same dataframe based on parent id根据父ID合并来自同一数据帧的多行
【发布时间】:2019-09-24 13:51:14
【问题描述】:

我有一个数据框,其中某些行具有父子关系。比如1002是1003的父级,1003是1004的父级

    import pandas as pd
    import numpy as np

    df = pd.DataFrame(columns=['Id', 'Parent Id', 'Child Id', 'A', 'B'],
                      data=[[1001, np.nan, 1005, 'A1001', 'B1001'],
                            [1002, np.nan, 1003, 'A1002', 'B1002'],
                            [1003, 1002, 1004, 'A1003', np.nan],
                            [1004, 1003, np.nan, 'A1004', np.nan],
                            [1005, 1001, np.nan, 'A1005', np.nan]
                            ])
    print(df)

         Id  Parent Id  Child Id      A      B
    0  1001        NaN    1005.0  A1001  B1001
    1  1002        NaN    1003.0  A1002  B1002
    2  1003     1002.0    1004.0  A1003    NaN
    3  1004     1003.0       NaN  A1004    NaN
    4  1005     1001.0       NaN  A1005    NaN

我想合并这些行以仅保留那些没有子项的行。我知道我可以用

    df = df[df['Child Id'].isnull()]

但是,某些信息仅出现在父行中,而在子行中缺失,例如来自 1002 的“B”列。我想将它继承到最新的子行。

下面是预期的输出:

        Id  Parent Id  Child Id      A      B
    3  1004     1003.0       NaN  A1004  B1002
    4  1005     1001.0       NaN  A1005  B1001

我可以使用内置的 pandas 方法来代替迭代行吗?

【问题讨论】:

  • 您是如何确定值“B1002”属于 Id 1004 的?
  • 不确定第二行的 A1004 与您的数据框不匹配:您可以尝试df.ffill()[df['Child Id'].isnull()] 或类似的东西吗?
  • @Datanovice 感谢您的建议,它与我正在寻找的类似。但它可能不是一个很好的顺序来填充。它会填充我不想填写的“儿童 ID”列(抱歉 A1004 是一个错字,我已经更正了我的问题)
  • @Aryere "B1002" for 1004 继承自它的父级 (1003) 的父级 (1002)

标签: python python-3.x pandas dataframe


【解决方案1】:

您需要从父子关系链中获取B 列中的值。你可以这样做:

for i in range(max_length_of_relationships):
    df = df.merge(df[['Id', 'B']].rename({'Id': 'Parent Id', 'B': 'Parent B'}, axis=1), how='left')
    df['B'] = df['B'].combine_first(df['Parent B'])
    df.drop('Parent B', axis=1, inplace=True)

其中max_length_of_relationships是一条链中父子链接的最大数量(df中的2:1.10002-10003,2.10003-10004),如果不确定数字是多少,请使用大数字那是无法超越的。 然后像你一样只留下没有孩子的行:

df = df[df['Child Id'].isnull()]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2020-01-24
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多