我在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中的默认行为?
这是字典迭代的方式与大熊猫系列的处理方式之间的区别.
pandas系列在分配给行时将其索引与列匹配,如果分配给列,则匹配索引.之后,它会分配与匹配的索引或列对应的值.
当一个对象不是具有方便索引对象的pandas对象时,pandas将遍历该对象.一个字典遍历它的键,这就是你在那些行插槽中看到字典键的原因.字典未排序,这就是您在该行中看到随机键的原因.
| 归档时间: |
|
| 查看次数: |
3307 次 |
| 最近记录: |