我有一个组织数据集,这些组织通过各个委员会的共享关系进行链接。数据采用这种格式(略微简化):
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行,它似乎也不应该采取这种内存开销。
答案 0 :(得分:1)
问题在于list.append。 你可以使用python的networkx包。
import networkx as nx
G = nx.from_pandas_frame(df, sorce_col_name, target_col_name)
获得图表后,您可以继续使用networkx或提取其节点/楔形并将其保存到csv进行进一步分析