为什么熊猫操作df.loc [:, ['a','b'] = df.loc [:, ['c','d']不会更改df.loc [:, ['a ','b']?

时间:2020-04-16 06:36:44

标签: python pandas numpy

我必须使用df.loc[:, ['a', 'b'] = df.loc[:, ['c', 'd'].values成功更改df.loc[:, ['a', 'b']中的值,为什么?

相反,df.loc[:, ['a'] = df['c']有效!为什么?

dfpandas.DataFrame

2 个答案:

答案 0 :(得分:1)

答案适用于较早的熊猫版本,在最新版本的熊猫中都可以正常使用,这意味着不必转换为numpy数组或重命名列。

原因称为索引对齐,这里为c,d列分配了不同的列名a,b,所以失败了。为防止这种情况,它用于将选定的DataFrame转换为numpy数组,因为该数组没有任何列,因此效果很好。

或者您可以在两个DataFrame中对相同的列名称使用rename

df = pd.DataFrame({
        'a':list('abcdef'),
         'b':[4,5,4,5,5,4],
         'c':[7,8,9,4,2,3],
         'd':[1,3,5,7,1,0],
})

df.loc[:, ['a', 'b']] = df.loc[:, ['c', 'd']].rename(columns={'c':'a', 'd':'b'})
print (df)
   a  b  c  d
0  7  1  7  1
1  8  3  8  3
2  9  5  9  5
3  4  7  4  7
4  2  1  2  1
5  3  0  3  0

“系列”中没有专栏,因此效果很好。

答案 1 :(得分:0)

在@jezrael回答之后,您可以使用相同的语法为新的列定义重新分配列,我的意思是:

import pandas as pd

df = pd.DataFrame({
         'a':list('abcdef'),
         'b':[4,5,4,5,5,4],
         'c':[7,8,9,4,2,3],
         'd':[1,3,5,7,1,0]})

df[['a', 'b']] = df.loc[:, ['c', 'd']]
df[['a', 'b']] = df[['c', 'd']]

两条线都会产生预期的结果。另一方面,要在左侧使用loc,您可以将右侧转换为numpy数组,或按jezrael答案中的方式重命名列:

df.loc[:, ['a', 'b']] = df.loc[:, ['c', 'd']].to_numpy()
相关问题