基于父id合并同一数据帧中的多行

2024-09-27 21:31:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,其中一些行具有父子关系。例如,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方法来代替迭代行吗?你知道吗


Tags: importidchildpandasdfasnpnan
1条回答
网友
1楼 · 发布于 2024-09-27 21:31:30

您需要在父子关系链的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),如果您不确定数字是什么,请使用不能超过的大数字。 然后只保留没有childs的行,就像处理:

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

相关问题 更多 >

    热门问题