使用字典更新pandas DataFrame行

J J*_*nes 8 python pandas

我在pandas DataFrames中发现了一个我不明白的行为.

df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=['one', 'one', 'two'], columns=['col1', 'col2', 'col3'])
new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'})
df.iloc[0] = new_data
# resulting df looks like:

#       col1    col2    col3
#one    new     new     new
#one    9       6       1
#two    8       3       7
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试添加字典,我会得到这个:

new_data = {'col1': 'new', 'col2': 'new', 'col3': 'new'}
df.iloc[0] = new_data
#
#         col1  col2    col3
#one      col2  col3    col1
#one      2     1       7
#two      5     8       6
Run Code Online (Sandbox Code Playgroud)

为什么会这样?在写这个问题的过程中,我意识到df.loc很可能只是从new_data中获取密钥,这也解释了为什么值不正常.但是,再次,为什么会这样呢?如果我尝试从字典创建一个DataFrame,它会像处理列一样处理键:

pd.DataFrame([new_data])

#    col1   col2    col3
#0  new     new     new
Run Code Online (Sandbox Code Playgroud)

为什么这不是df.loc中的默认行为?

piR*_*red 7

这是字典迭代的方式与大熊猫系列的处理方式之间的区别.

pandas系列在分配给行时将其索引与列匹配,如果分配给列,则匹配索引.之后,它会分配与匹配的索引或列对应的值.

当一个对象不是具有方便索引对象的pandas对象时,pandas将遍历该对象.一个字典遍历它的键,这就是你在那些行插槽中看到字典键的原因.字典未排序,这就是您在该行中看到随机键的原因.