根据其索引值将df行附加到另一个df中

时间:2018-10-16 13:54:51

标签: python pandas

我有以下df1

              col1    col2   col3  col4  col5
        A       3       4     1      2    1
        B       2       1     2      3    1
        C       2       3     4      2    1

另一方面,我有df2

              type    col1    col2   col3
        j      A       0.5     0.7    0.1
        k      B       0.2     0.3    0.9 
        l      A       0.5     0.3    0.2
        m      C       0.8     0.7    0.1
        n      A       0.3     0.3    0.2
        o      B       0.1     0.7    0.3

鉴于type中的列df2,我想生成像这样的数据透视表:

             col1    col2   col3  col4  col5
    A          3       4     1      2    1
        j     0.5     0.7    0.1
        l     0.5     0.3    0.2
        n     0.3     0.3    0.2
    B          2       1     2      3    1
        k     0.2     0.3    0.9 
        o     0.1     0.7    0.3
    C          2       3     4      2    1
        m     0.8     0.7    0.1

大熊猫中是否存在预制函数,可以用来将df2中的每一行追加到df1中的相应索引之下?

对不起,我没有尝试,但是我不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

似乎您在这里需要MultiIndex。您应该使用NaN索引,如您期望的结果所示:标签缺乏意义。一种想法是使用非字母指示符,例如0

# set index as (type, current_index) for df2
df2 = df2.reset_index().set_index(['type', 'index']).sort_index()

# reassign index as (type, 0) for df1
df1.index = pd.MultiIndex.from_tuples([(i, 0) for i in df1.index])

# concatenate df1 and df2
res = pd.concat([df1, df2]).sort_index()

print(res)

     col1  col2  col3  col4  col5
A 0   3.0   4.0   1.0   2.0   1.0
  j   0.5   0.7   0.1   NaN   NaN
  l   0.5   0.3   0.2   NaN   NaN
  n   0.3   0.3   0.2   NaN   NaN
B 0   2.0   1.0   2.0   3.0   1.0
  k   0.2   0.3   0.9   NaN   NaN
  o   0.1   0.7   0.3   NaN   NaN
C 0   2.0   3.0   4.0   2.0   1.0
  m   0.8   0.7   0.1   NaN   NaN

答案 1 :(得分:2)

使用pd.mergesort_index指定na_position='first'

pd.merge(df2.reset_index(), 
         df.reset_index().rename(columns={'index':'type'}),
         'outer')\
.set_index(['type', 'index'])\
.sort_index(na_position='first')

                col1   col2   col3  col4   col5
type    index                   
A       NaN     3.0    4.0    1.0   2.0    1.0
        j       0.5    0.7    0.1   NaN    NaN
        l       0.5    0.3    0.2   NaN    NaN
        n       0.3    0.3    0.2   NaN    NaN
B       NaN     2.0    1.0    2.0   3.0    1.0
        k       0.2    0.3    0.9   NaN    NaN
        o       0.1    0.7    0.3   NaN    NaN
C       NaN     2.0    3.0    4.0   2.0    1.0
        m       0.8    0.7    0.1   NaN    NaN

如@jpp所强调的,在sort_index的文档中,它表示

  

na_position:{'first','last'},默认为'last'   首先将NaN放在开头,最后将NaN放在结尾。 未针对MultiIndex实施。

尽管实际上似乎确实已实现。

但是,如果您认为此行为可能不一致,则可以选择先sort_values,然后再设置索引。在sort_values文档中,不存在未实施的警告。

pd.merge(df2.reset_index(), 
         df.reset_index().rename(columns={'index':'type'}), 
         'outer')\
.sort_values(['type', 'index'], na_position='first')\
.set_index(['type', 'index'])

答案 2 :(得分:2)

类似于@jpp

d2 = df2.rename_axis('k').set_index('type', append=True).swaplevel(0, 1)
d1 = df1.set_index(np.zeros(len(df1), str), append=True).rename_axis(['type', 'k'])

d1.append(d2).sort_index()

        col1  col2  col3  col4  col5
type k                              
A        3.0   4.0   1.0   2.0   1.0
     j   0.5   0.7   0.1   NaN   NaN
     l   0.5   0.3   0.2   NaN   NaN
     n   0.3   0.3   0.2   NaN   NaN
B        2.0   1.0   2.0   3.0   1.0
     k   0.2   0.3   0.9   NaN   NaN
     o   0.1   0.7   0.3   NaN   NaN
C        2.0   3.0   4.0   2.0   1.0
     m   0.8   0.7   0.1   NaN   NaN

备用

df1.rename_axis('type').assign(k='').set_index('k', append=True).append(
    df2.rename_axis('k').set_index('type', append=True).swaplevel(0, 1)
).sort_index()

        col1  col2  col3  col4  col5
type k                              
A        3.0   4.0   1.0   2.0   1.0
     j   0.5   0.7   0.1   NaN   NaN
     l   0.5   0.3   0.2   NaN   NaN
     n   0.3   0.3   0.2   NaN   NaN
B        2.0   1.0   2.0   3.0   1.0
     k   0.2   0.3   0.9   NaN   NaN
     o   0.1   0.7   0.3   NaN   NaN
C        2.0   3.0   4.0   2.0   1.0
     m   0.8   0.7   0.1   NaN   NaN