我必须使用df.loc[:, ['a', 'b'] = df.loc[:, ['c', 'd'].values
成功更改df.loc[:, ['a', 'b']
中的值,为什么?
相反,df.loc[:, ['a'] = df['c']
有效!为什么?
df
是pandas.DataFrame
。
答案 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()