【问题标题】:Merging dataframes to include columns indicating which dataframes the rows belong to合并数据框以包含指示行属于哪些数据框的列
【发布时间】:2017-08-31 06:14:39
【问题描述】:

我有两个数据框(a 是可散列的,b 是不可散列的)

   Foo              
    a   b           
A   1   2       
B   1   3       
C   0   4       

 Bar
a   b
A   1   2
D   0   6

如果索引或代码(在本例中为 A、B、C、D)相同,则 a 和 b 必须相同。 我想知道如何合并这两个显示列所属位置的数据框。

    a   b   Foo   Bar
A   1   2    1     1
B   1   3    1     0
C   0   4    1     0
D   0   6    0     1

获取此数据帧的最有效方法是什么?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您应该可以使用df.merge

    df1['Foo'] = 1
    df2['Bar'] = 1
    out = df1.merge(df2, on=['a', 'b'], how='outer').fillna(0).astype(int)
    
    print(out)
       a  b  Foo  Bar
    0  1  2    1    1
    1  1  3    1    0
    2  0  4    1    0
    3  0  6    0    1
    

    【讨论】:

    • 谢谢,但是如果 b 列是一个无法散列的 numpy 数组怎么办
    • @niukasu 但你最初的问题并没有问这个问题。请在新线程中提出单独的问题。那将需要一个完全不同的答案。
    【解决方案2】:

    如果assign 的数据中没有NaN 并且merge 的外部联接,则为一行解决方案。但是有必要为来自index 的列添加reset_index,因为需要将列与索引合并在一起。最后set_indexrename_axis 用于创建index 返回。

    参数on 可以删除,因为在两个DataFrames 中加入了相同的列。

    df = pd.merge(Foo.reset_index().assign(Foo=1), 
                  Bar.reset_index().assign(Bar=1), how='outer') \
           .fillna(0) \
           .set_index('index') \
           .rename_axis(None) \
           .astype(int)
    print (df)
       a  b  Foo  Bar
    A  1  2    1    1
    B  1  3    1    0
    C  0  4    1    0
    D  0  6    0    1
    

    如果可能 NaNs 则仅对指标列使用子集:

    df = pd.merge(Foo.reset_index().assign(Foo=1), 
                  Bar.reset_index().assign(Bar=1), how='outer') \
           .set_index('index') \
           .rename_axis(None) 
    df[['Foo','Bar']] = df[['Foo','Bar']].fillna(0).astype(int)
    print (df)
       a    b  Foo  Bar
    A  1  NaN    1    1
    B  1  3.0    1    0
    C  0  4.0    1    0
    D  0  6.0    0    1
    

    pandas通过参数indicator实现了类似的方式:

    df = pd.merge(Foo.reset_index().assign(Foo=1), 
                  Bar.reset_index().assign(Bar=1), how='outer', indicator='indicator') \
           .set_index('index') \
           .rename_axis(None) 
    print (df)
       a  b  Foo  Bar   indicator
    A  1  2  1.0  1.0        both
    B  1  3  1.0  NaN   left_only
    C  0  4  1.0  NaN   left_only
    D  0  6  NaN  1.0  right_only
    

    【讨论】:

    • 谢谢,但是如果 b 列是一个无法散列的 numpy 数组怎么办
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2017-08-29
    相关资源
    最近更新 更多