有什么方法可以优化 运行 时间吗?尝试将数据添加到来自不同数据框的新列

Any way to optimize the running time? Trying to add data to a new column from different dataframe

我有 2 个数据框:节点和边。 边 DF 仅包含 From ID 和 to ID,我的目标是再添加两列(From Age,To Age)以进行一些统计。年龄数据位于节点 DF 中。 数据帧中大约有 1.2M 个节点和 14M 个边

现在这就是我努力实现它的方式:

edges['From Age'] = np.nan
for i in range(len(edges)):
   edges.loc[i+1, 'From Age'] = int((nodes.loc[nodes['ID'] == (edges.iloc[i])['From']])['Age'])

这需要很长时间(花了好几个小时才完成),我找不到或想不出更有效的方法来解决这个问题。 请多多指导。

**我的数据的示例切片(在我过滤掉不相关的行后,如 ID=2:

ID,Gender,Region,Age
1,1.0,"zilinsky kraj, zilina",26.0
3,1.0,"bratislavsky kraj, bratislava - karlova ves",29.0
4,0.0,"banskobystricky kraj, brezno",26.0
5,1.0,"zilinsky kraj, zilina",26.0
6,0.0,"zilinsky kraj, zilina",38.0

还有几条边:

From,To
1,6
1,3
1,4
1,5

假设您有从零开始的整数 ID,您可以:

# Create some example dataframes
n_nodes=int(10E6)
n_edges=int(1.4*10E6)
edges = pd.DataFrame.from_dict({'From': np.random.randint(0,n_nodes,size=n_edges), 'To': np.random.randint(0,n_nodes,size=n_edges)})
nodes = pd.DataFrame.from_dict({'Age': np.random.randint(18,90,size=n_nodes), 'ID': np.random.permutation(np.arange(n_nodes))})

# assuming you have integer ID's:
nodes.sort_values(by="ID", ascending=True, inplace=True)
edges['Age From'] = nodes['Age'].to_numpy()[edges['From'].to_numpy()]
edges['Age To'] = nodes['Age'].to_numpy()[edges['To'].to_numpy()]

我用了不到 1 秒(不包括生成所有那些随机数)。 这个想法是,如果你用一个整数数组索引一个数组,它会在该特定位置提取值示例:

np.array(['A', 'B', 'C', 'D'])[np.array([0,0,1,3,3,2], dtype=int)]

return array(['A', 'A', 'B', 'D', 'D', 'C'], dtype='<U1')


您的代码存在问题,nodes['ID'] == (edges.iloc[i]) 每次迭代都会创建一个包含 1M 条目的新数组!!!


如果您有字符串或其他 ID,您可以先尝试转换为类别。这对我来说大约需要一分钟,大部分时间花在前三行上:

nodes['ID']=nodes['ID'].astype('category')
edges['From'] = edges['From'].astype(nodes['ID'].dtype)
edges['To'] = edges['To'].astype(nodes['ID'].dtype)
edges['Age From'] = nodes['Age'].to_numpy()[edges['From'].cat.codes.to_numpy()]
edges['Age To'] = nodes['Age'].to_numpy()[edges['To'].cat.codes.to_numpy()]