繁体   English   中英

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

[英]why the pandas operation df.loc[:, ['a', 'b'] = df.loc[:, ['c', 'd'] does not change the values in df.loc[:, ['a', 'b']?

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

相比之下, df.loc[:, ['a'] = df['c']有效吗? 为什么?

dfpandas.DataFrame

Answer is for oldier pandas versions, in last version of pandas all working nice, it means not necessary convert to numpy arrays or rename columns.

原因叫做索引对齐,这里给a,b列分配了不同的列名c,d ,所以失败了。 为了防止它用于将选定的 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

在系列中不是列,所以工作得很好。

从@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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM