You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:33:16