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



我有 2 个数据帧:节点和边缘。 边缘DF仅包含From ID和To ID,我的目标是再添加两列(从年龄,到年龄(以进行一些统计。年龄数据位于节点 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)]

返回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()]

最新更新