使用过多内存的Pandas嵌套循环

时间:2016-04-18 02:47:46

标签: python pandas nested-loops igraph

我有一个组织数据集,这些组织通过各个委员会的共享关系进行链接。数据采用这种格式(略微简化):

organization name | committee name       | number of relationships
ABC Corporation   | Committee A          | 7
ACME Inc.         | Committee B          | 3
XYZ Corporation   | Committee A          | 2

目前这是一个pandas数据框,大约有3万行。

我需要修改数据框,将其反转,以便我可以使用igraph在R中进行网络分析。该分析需要两个csv文件,一个列出所有节点,另一个列出节点之间的所有“边缘”或关系。为了做到这一点,我正在使用两个带有itertuples的嵌套循环来构建一个新的数据框,记录组织之间的相互关系,即它们在同一个委员会中。

这是代码(不包括我在导入之后如何处理精炼数据,然后在导出之后导出它):

list_ = []
node_list = []
for row_a in network_df.itertuples():
    for row_b in network_df.itertuples():
        node_list.append({'node':row_a[1]})
        if row_a[2] == row_b[2] && row_a[1] != row_b[1]:
            temp_dict = {'from':row_a[1],'to':row_b[1], 'rels':row_a[3]}
            list_.append(temp_dict)

edge_df = pd.DataFrame(list_)
node_df = pd.DataFrame(node_list)

问题在于:这个过程永远不会完成,大熊猫最终会占用超过30GB的内存,最终我不得不终止进程。

我知道迭代一个pandas数据帧是错误的做法,但我不知道如何在没有嵌套循环的情况下反转这些数据。解决方案是使用本机Python列表或字典并使用嵌套循环吗?即使有30k行,它似乎也不应该采取这种内存开销。

1 个答案:

答案 0 :(得分:1)

问题在于list.append。 你可以使用python的networkx包。

import networkx as nx
G = nx.from_pandas_frame(df, sorce_col_name, target_col_name)

获得图表后,您可以继续使用networkx或提取其节点/楔形并将其保存到csv进行进一步分析