Python处理DataFrame字符串列表列,生成战争实体边列表求助
解决CSV中字符串转列表及生成战争实体边列表的问题
问题描述
我有一个存放在CSV里的DataFrame,包含Opp1和Opp2两列,每列的值都是字符串格式的可变长度列表。DataFrame结构如下:
Opp1 Opp2 0 ['KingdomofPoland','GrandDuchyofLithuania'] ['Georgia'] 1 ['NorthernYuanDynasty'] ['Georgia'] 2 ['SpanishEmpire','CaptaincyGeneralofChile'] ['ChechenRepublic'] ... ... ... 3409 ['Turkey','SyrianOpposition'] ['CatholicLeague','SpanishEmpire'] 3410 ['Egypt','UnitedArabEmirates'] ['SpanishEmpire'] 3411 ['Turkey','SyrianOpposition'] ['SpanishEmpire'] 3412 ['UnitedStates','UnitedKingdom','SaudiArabia'] ['SpanishEmpire'] 3413 ['Turkey'] ['Russia'] 3414 rows × 2 columns
经测试,列值为字符串类型:
Input - df['Opp1'][0][0] Out - '['
期望获取该行列表的首元素KingdomofPoland,而非[。
解决类型转换问题后,需要生成新列:将每行Opp1的每个实体与同一行Opp2的每个实体配对,形成新增行的数据集(示例见问题描述),最终得到战争参与实体的边列表用于Gephi分析。
注:Opp1和Opp2列存在重复条目,因同一国家多次参战。
解决方案
步骤1:读取CSV并将字符串转换为列表
使用ast.literal_eval()可以安全地将字符串形式的列表转换为实际的Python列表:
import pandas as pd import ast # 读取CSV文件,替换为你的文件路径 df = pd.read_csv('your_file.csv') # 转换Opp1和Opp2列的字符串为列表 df['Opp1'] = df['Opp1'].apply(ast.literal_eval) df['Opp2'] = df['Opp2'].apply(ast.literal_eval) # 验证转换结果 print(df['Opp1'][0][0]) # 输出:KingdomofPoland
步骤2:生成实体配对的边列表
通过explode和合并操作生成所有可能的实体配对:
# 展开Opp1列,每行保留一个实体及原索引 df_opp1 = df.explode('Opp1').reset_index() # 展开Opp2列,每行保留一个实体及原索引 df_opp2 = df.explode('Opp2').reset_index() # 按原索引合并,得到所有配对组合 edge_df = pd.merge(df_opp1[['index', 'Opp1']], df_opp2[['index', 'Opp2']], on='index') # 可选:生成包含配对的new_col列 edge_df['new_col'] = edge_df.apply(lambda row: [row['Opp1'], row['Opp2']], axis=1) # 查看前几行结果 print(edge_df.head())
如果偏好更直观的循环写法,也可以用列表推导式:
edges = [] for idx, row in df.iterrows(): for opp1_entity in row['Opp1']: for opp2_entity in row['Opp2']: edges.append({ 'index': idx, 'new_col': [opp1_entity, opp2_entity] }) edge_df = pd.DataFrame(edges)
步骤3:导出为Gephi兼容的格式
Gephi通常使用两列的CSV作为边列表(源节点+目标节点),直接导出即可:
# 导出Opp1(源)和Opp2(目标)列 edge_df[['Opp1', 'Opp2']].to_csv('war_entity_edges.csv', index=False)
内容的提问来源于stack exchange,提问作者Aalekh Roy
相关产品推荐
相关产品推荐

