【问题标题】:Create a new column from two columns of a dataframe where rows of each column contains list in string format从数据框的两列创建一个新列,其中每列的行包含字符串格式的列表
【发布时间】:2022-07-20 22:48:25
【问题描述】:

我有一个数据框(在 csv 文件中),其中有两列,每列都包含字符串格式的列表(可变长度)。我提供了指向我存储 csv 文件以供参考的 google 驱动器的链接https://drive.google.com/file/d/1Hdu04JdGpPqG9_k6Mjx_1XNLBvogXfnN/view?usp=sharing 数据框看起来像这样

              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 列的每一行中的列表元素来创建一个新列。 Opp1 列中每一行的元素是与 Opp2 列中同一行的相应国家/帝国发生战争的国家和帝国的名称。 所以基本上是一个带有行条目的新列

             new_col
0     ['KingdomofPoland', 'Georgia']
0     ['GrandDuchyofLithuania', 'Georgia']
1     ['NorthernYuanDynasty', 'Georgia']
2     ['SpanishEmpire', 'ChechenRepublic']
2     ['CaptaincyGeneralofChile', 'ChechenRepublic']
... ... ...
3409    ['Turkey', 'CatholicLeague']
3409    ['Turkey', 'SpanishEmpire']
3409    ['SyrianOpposition', 'CatholicLeague]
3409    ['SyrianOpposition', 'SpanishEmpire']
3410    ['Egypt','SpanishEmpire']
3410    ['UnitedArabEmirates','SpanishEmpire']
3411    ['Turkey', 'SpanishEmpire']
3411    ['SyrianOpposition', 'SpanishEmpire']
.................

这实质上将引入新行,因为我们有点爆炸 Opp1 和 Opp2 列同时迭代行元素。

最终目标是获得参与特定战争的国家的边缘列表,由原始 Opp1(opposition 1) 和 Opp2(opposition2) 列表示。 Opp1 行列表中的每个实体(国家)应附加到 Opp2 行列表的每个实体(国家)。最终的数据集将在 Gephi 上用作边缘列表。

我是使用 python 进行数据分析的初学者。到目前为止,我一直在手动清理我的数据集,这已经消耗了十几个宝贵的时间。谁能帮我解决这个问题。

注意 - 在 Opp1 和 Opp2 列的每一行中都有多个相似的条目,因为同一国家在不同年份多次打仗。

我按要求附上了我的数据框的 df_types 的图片。

【问题讨论】:

  • 您介意展示您的 df 数据类型吗?
  • @INGl0R1AM0R1 我已经添加了图片,在底部你可以看到 df dtypes
  • @Nick_Z0 在 Opp1 和 Opp2 两列中的任何一个上使用 .explode 什么都不做。正如我在问题中解释的那样,每列的行条目不是列表,而是格式化为列表的字符串。当我查询 Opp1 列第一行的第一个元素时,它不返回元素名称,而是返回 '[' 作为输出。所以我相信这就是为什么 explode() 不起作用。

标签: python pandas dataframe


【解决方案1】:

好的,我必须通过删除字符串内单引号来清理一些数据。 我使用库 yaml 使用 applymap 将您的字符串转换为每个 pandas 数据框单元格中的实际列表。

import yaml
import pandas as pd

df = pd.read_csv('Downloads/nodes_list.csv', index_col=[0])

df['Opp1'] = df['Opp1'].str.replace("[\'\"]s",'s', regex=True)
df['Opp2'] = df['Opp2'].str.replace("[\'\"]s",'s', regex=True)

df = df.applymap(yaml.safe_load)

df_new = df.explode('Opp1').explode('Opp2').apply(list, axis=1)

df_new

输出:

0                       [KingdomofPoland, Georgia]
0                 [GrandDuchyofLithuania, Georgia]
1                   [NorthernYuanDynasty, Georgia]
2                 [SpanishEmpire, ChechenRepublic]
2       [CaptaincyGeneralofChile, ChechenRepublic]
                           ...                    
3411             [SyrianOpposition, SpanishEmpire]
3412                 [UnitedStates, SpanishEmpire]
3412                [UnitedKingdom, SpanishEmpire]
3412                  [SaudiArabia, SpanishEmpire]
3413                              [Turkey, Russia]
Length: 31170, dtype: object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多