【问题标题】:How to merge two dataframes with not identical columns like this way? Python如何以这种方式合并具有不相同列的两个数据框? Python
【发布时间】:2021-12-05 15:53:04
【问题描述】:

我有两个数据框看起来像这样(实际更大):

DF1:

Alliances_names Value1
cgc inc/nshow ltd/noracle inc 500
steam/nsoap jv NaN
saints bd 8
watrloo jv/ncgc inc/nflow inc 19

DF2:

Company Number1 Number2
steam 15 y
soap jv 2000 n
cgc inc 4565 n
show ltd 1 n
flow inc 1111 y
watrloo jv 6756 n

我必须将这两个数据框与联盟和公司列合并。如果是联盟公司,我必须将此信息添加到行中。 (DF1中公司之间有/n分隔符)
结果应该是这样的:

Alliances_names Value1 Company Number1 Number2
cgc inc/nshowltd/noracle inc 500 cgc inc 4565 n
cgc inc/nshowltd/noracle inc 500 show ltd 1 n
steam/nsoap jv NaN steam 15 y
steam/nsoap jv NaN soap jv 2000 n
saints bd 8 NaN NaN NaN
watrloo jv/ncgc inc/nflow inc 19 watrloo jv 6756 n
watrloo jv/ncgc inc/nflow inc 19 cgc inc 4565 n
watrloo jv/ncgc inc/nflow inc 19 flow inc 1111 y

我需要为其中的每家公司复制联盟名称。 我试图将“联盟名称”中的公司分开,并用每个单元格中的公司列表制作另一列,但是“isin”不能很好地处理它,我无法使用重复的数据框。 提前感谢您的帮助!

【问题讨论】:

    标签: python python-3.x pandas dataframe merge


    【解决方案1】:
    1. 使用splitexplode 创建一个单独的列(称为“公司”),其中包含各个公司名称。
    2. merge“公司”列上的两个 DataFrame。
    df1["Company"] = df1["Alliances_names"].str.split("/n")
    df1 = df1.explode("Company")
    output = df1.merge(df2, on="Company", how="left")
    
    >>> output
                     Alliances_names  Value1     Company  Number1 Number2
    0  cgc inc/nshow ltd/noracle inc   500.0     cgc inc   4565.0       n
    1  cgc inc/nshow ltd/noracle inc   500.0    show ltd      1.0       n
    2  cgc inc/nshow ltd/noracle inc   500.0  oracle inc      NaN     NaN
    3                 steam/nsoap jv     NaN       steam     15.0       y
    4                 steam/nsoap jv     NaN     soap jv   2000.0       n
    5                      saints bd     8.0   saints bd      NaN     NaN
    6  watrloo jv/ncgc inc/nflow inc    19.0  watrloo jv   6756.0       n
    7  watrloo jv/ncgc inc/nflow inc    19.0     cgc inc   4565.0       n
    8  watrloo jv/ncgc inc/nflow inc    19.0    flow inc   1111.0       y
    
    编辑:

    要只保留所有 Alliances_names 在 df2 中的行,您可以这样做:

    output = output[output["Alliances_names"].str.split("/n").map(set(df2["Company"]).issuperset)]
    
    >>> output
                     Alliances_names  Value1     Company  Number1 Number2
    3                 steam/nsoap jv     NaN       steam     15.0       y
    4                 steam/nsoap jv     NaN     soap jv   2000.0       n
    6  watrloo jv/ncgc inc/nflow inc    19.0  watrloo jv   6756.0       n
    7  watrloo jv/ncgc inc/nflow inc    19.0     cgc inc   4565.0       n
    8  watrloo jv/ncgc inc/nflow inc    19.0    flow inc   1111.0       y
    

    【讨论】:

    • 还有一个问题。如果 df2 中没有所有联盟,有没有办法从“alliances_names”中删除联盟?结果将只有带有重复项的 steam/nsoap jv 和带有重复项的 watrloo jv/ncgc inc/nflow inc。
    • @AnnaShevtsova - 已编辑!
    • 谢谢!但它在 164000 行的数据集中工作起来很奇怪。它删除了一些包含所有公司都在“公司”中的联盟的行,我不知道为什么:(我在手动检查一些数据时注意到了这一点。
    • 不应该 - 逻辑不取决于数据框的大小。可能是您的实际数据(拼写差异或前导/尾随空格等)。
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2020-12-04
    • 2021-01-16
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多