Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于父id合并来自同一数据帧的多行_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 基于父id合并来自同一数据帧的多行

Python 基于父id合并来自同一数据帧的多行,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个数据框,其中一些行具有父子关系。例如,1002是1003的父级,1003是1004的父级 将熊猫作为pd导入 将numpy作为np导入 df=pd.DataFrame(列=['Id','Parent Id','Child Id','A','B'], 数据=[[1001,np.nan,1005,'A1001','B1001'], [1002,np.nan,1003,'A1002','B1002'], [100310021004,'A1003',北卡罗来纳州南部], [10041003,北卡

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

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(列=['Id','Parent Id','Child Id','A','B'],
数据=[[1001,np.nan,1005,'A1001','B1001'],
[1002,np.nan,1003,'A1002','B1002'],
[100310021004,'A1003',北卡罗来纳州南部],
[10041003,北卡罗来纳州南部,'A1004',北卡罗来纳州南部],
[10051001,np.nan,'A1005',np.nan]
])
打印(df)
Id父Id子Id A B
0 1001 NaN 1005.0 A1001 B1001
1002南1003.0 A1002 B1002
2 1003 1002.0 1004.0 A1003 NaN
310041003.0NAN A1004 NaN
4 1005 1001.0 NaN A1005 NaN
我想合并这些行,只保留那些没有子项的行。我知道我可以用它来做

    df = df[df['Child Id'].isnull()]
但是,某些信息仅显示在父行中,但子行中缺少,例如1002中的“B”列。我想将其继承到最新的子行

以下是预期产出:

Id父Id子Id A B
3 1004 1003.0 NaN A1004 B1002
4 1005 1001.0 NaN A1005 B1001

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

您需要在父子关系链的
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\u length\u of_relationships
是一条链中父子链接的最大数量(df中的2个:1.10002-10003,2.10003-10004),如果您不确定该数字是多少,请使用无法超过的大数字。 然后只保留不带childs的行,就像您处理:

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

您是如何确定值“B1002”属于Id 1004的?不确定您是如何得到与您的数据帧不匹配的第二行的A1004的:您可以尝试
df.ffill()[df['Child Id'].isnull()]
或类似的内容?@datanovel谢谢您的建议,它与我正在寻找的内容类似。但这可能不是一个好的下场。它将填充我不想显示的“Child Id”列(很抱歉A1004是一个输入错误,我已经更正了我的问题)@Aryere“B1002”用于1004是从它的父(1003)的父(1002)继承的