【问题标题】:Pandas: Merge or join dataframes based on column data?Pandas:基于列数据合并或连接数据框?
【发布时间】:2013-10-29 00:56:18
【问题描述】:

我正在尝试将几列数据添加到现有数据框中。数据框本身是由许多其他数据框构建的,我成功地加入了相同的索引。为此,我使用了这样的代码:

    data = p_data.join(r_data)

我实际上在多索引上加入了这些,因此数据框如下所示,其中 Name1 和 Name 2 是索引:

    Name1    Name2    present    r      behavior
    a        1        1          0      0
             2        1          .5     2
             4        3          .125   1
    b        2        1          0      0
             4        5          .25    4
             8        1          0      1

所以 Name1 索引不会重复数据,但 Name2 索引会(我使用它来跟踪 dyads,因此 Name1 和 Name2 一起只表示一次)。我现在要添加的是与 Name2 数据相对应的 4 列数据(关于 dyad 的第二个成员的信息)。与“当前”“r”和“行为”数据不同,这些数据是针对个人的,而不是针对每个人的。所以合并时不需要考虑Name1数据。

问题在于,虽然重复 Name2 数据以耗尽二元组合,但我现在要添加的数据中的“Name2”列对于每个 Name2 个体只有一条数据:

    Name2    Data1    Data2    Data3
    1        80       6        1
    2        61       8        3
    4        45       7        2
    8        30       3        6

我希望输出的样子:

    Name1    Name2    present    r      behavior    Data1    Data2    Data3
    a        1        1          0      0           80       6        1
             2        1          .5     2           61       8        3
             4        3          .125   1           45       7        2
    b        2        1          0      0           61       8        3
             4        5          .25    4           45       7        2
             8        1          0      1           30       3        6

尽管阅读了文档,但我不清楚是否可以使用 join() 或 merge() 来获得所需的结果。如果我尝试像以前使用的简单数据框一样连接现有数据框,我最终会得到新列,但它们充满了 NaN 值。我还尝试了使用 Name1 和 Name2 作为列或索引的各种组合,使用连接或合并(不像听起来那么随机,但我显然没有正确解释文档!)。非常感谢您的帮助,因为我现在非常迷茫。

【问题讨论】:

    标签: python join merge pandas


    【解决方案1】:

    我不确定这是否是最好的方法,但您可以使用 reset_index 临时使您的原始 DataFrame 仅由 Name2 索引。然后你可以像往常一样执行join。然后使用set_index 再次使Name1 成为MultiIndex 的一部分:

    import pandas as pd
    
    df = pd.DataFrame({'Name1':['a','a','a','b','b','b'],
                       'Name2':[1,2,4,2,4,8],
                       'present':[1,1,3,1,5,1]})
    df.set_index(['Name1','Name2'], inplace=True)
    
    df2 = pd.DataFrame({'Data1':[80,61,45,30],
                        'Data2':[6,8,7,3]},
                       index=pd.Series([1,2,4,8], name='Name2'))
    result = df.reset_index(level=0).join(df2).set_index('Name1', append=True)
    print(result)
    #              present  Data1  Data2
    # Name2 Name1                       
    # 1     a            1     80      6
    # 2     a            1     61      8
    #       b            1     61      8
    # 4     a            3     45      7
    #       b            5     45      7
    # 8     b            1     30      3
    

    要使结果看起来更像您想要的 DataFrame,您可以对索引重新排序和排序:

    print(result.reorder_levels([1,0],axis=0).sort(axis=0))
    #              present  Data1  Data2
    # Name1 Name2                       
    # a     1            1     80      6
    #       2            1     61      8
    #       4            3     45      7
    # b     2            1     61      8
    #       4            5     45      7
    #       8            1     30      3
    

    【讨论】:

    • 这行得通——我一定是设置了错误的参数,因为这是我尝试的方法之一。很高兴知道我没有走错方向。)
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多