我有一个数据帧,其中一些行具有父子关系。例如,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方法可以用来代替迭代行呢?
发布于 2019-09-24 05:51:14
您需要在父子关系链的下游获取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()]
https://stackoverflow.com/questions/58073380
复制