我正在尝试将一个熊猫数据帧的值分配给另一个数据帧。 但是,作业结果的行为不符合我的预期,我不确定为什么。 我有一个解决方法,但是,我不明白为什么需要这种解决方法,或者它是否是首选的解决方法。
我像这样设置我的数据:
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
解释@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 列表中进行验证。两者都是可以接受的。