使用另一个数据框中匹配索引的值设置数据框列

6

我希望能够使用在DF2中与col2匹配的值,设置DF1col2的值:

DF1

         col1    col2
index
    0       a
    1       b
    2       c
    3       d
    4       e
    5       f

DF2:

         col1    col2
index
    2       a      x
    3       d      y
    5       f      z

DF3:

         col1    col2
index
    0       a     NaN
    1       b     NaN
    2       c       x
    3       d       y
    4       e     NaN
    5       f       z

如果我只是尝试设置 DF1['col2'] = DF2['col2'],则在 DF3 中,col2 的所有值都变成了 NaN - 我想这是因为索引不同。但是当我尝试使用 map() 进行如下操作时:
DF1.index.to_series().map(DF2['col2'])

然后我仍然得到相同的NaN列,但我以为它会将值映射到索引匹配的位置...

我哪里理解错了?


{btsdaf} - Shadab Faiz
2个回答

9
你需要使用joinassign函数:
df = df1.join(df2['col2'])
print (df)
      col1 col2
index          
0        a  NaN
1        b  NaN
2        c    x
3        d    y
4        e  NaN
5        f    z

或者:

df1 = df1.assign(col2=df2['col2']) 
#same like
#df1['col2'] = df2['col2']
print (df1)

      col1 col2
index          
0        a  NaN
1        b  NaN
2        c    x
3        d    y
4        e  NaN
5        f    z

如果没有匹配项,并且所有值都是 NaN,则检查两个 df 中的索引是否具有相同的数据类型:

print (df1.index.dtype)
print (df2.index.dtype)

如果不行,那么请使用astype:
df1.index = df1.index.astype(int)
df2.index = df2.index.astype(int)

不好的解决方案(检查索引2):

df = df2.combine_first(df1)
print (df)
      col1 col2
index          
0        a  NaN
1        b  NaN
2        a    x
3        d    y
4        e  NaN
5        f    z

1
你可以简单地连接它们,就像根据索引组合一样。
df = pd.concat([df1['col1'], df2['col2']],axis = 1)

        col1    col2
index       
0       a   NaN
1       b   NaN
2       c   x
3       d   y
4       e   NaN
5       f   z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接