熊猫数据框到数据框的分配未对齐并产生NaN

时间:2018-12-20 08:17:00

标签: python pandas

我正在尝试将一个Pandas数据框的值分配给另一个数据框。但是,分配结果没有达到我的预期,我不确定为什么。我有一个解决方法,但是我不明白为什么需要这种解决方法,或者它是否是首选的解决方法。

我这样设置数据:

d1 = {'col1': [1,2,3,4,5], 'col2': ['a','ERROR','ERROR','ERROR', 'e']}
df1 = pd.DataFrame(data=d1)
d2 = {'col3': ['b','c','d']}
df2 = pd.DataFrame(data=d2)
bad = (df1['col2'] == 'ERROR') 

这是我尝试过的方法(但未按预期工作):

df1.loc[bad,'col2'] = df2.loc[:,'col3']
print(df1)

   col1 col2
0     1    a
1     2    c
2     3    d
3     4  NaN
4     5    e

但是,如果我将代码更改为以下代码,则它确实可以工作:

df1.loc[bad,'col2'] = df2.loc[:,'col3'].values
print(df1)

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

1 个答案:

答案 0 :(得分:1)

解释@coldspeed条评论。

尝试一下:

df1.loc[bad, 'col2'] 

给你

1    ERROR
2    ERROR
3    ERROR
Name: col2, dtype: object

您可以看到上面的数据具有索引1,2和3。现在检查df2索引

    col3
0   b
1   c
2   d

因此,当您使用df1.loc[bad,'col2'] = df2.loc[:,'col3']进行替换时,只有第二和第三个索引会获取值。但是,当您使用values时,您可以正确进行,因为这形成了一个numpy数组,可以从type(df2.col3.values)或使用type(df2.col3.tolist())的python列表中进行验证。他们俩都可以接受。