pandas有条件的对多列进行赋值

首先我们这里有一个DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame(np.reshape(np.arange(20), (4,5)), columns=list('abcde'), index=list('lkjg'))

pandas有条件的对多列进行赋值_第1张图片

如果我们需要对其中的单列进行有条件的赋值,那么最简单的方法直接用.loc

pandas有条件的对多列进行赋值_第2张图片

可以看到a列的2/4行满足条件,替换成了c列的值。
但是当单列变成多列,情况就不一样了。

pandas有条件的对多列进行赋值_第3张图片

我们用一样的.loc发现,满足条件的2/4并没有被替换,反而是变成了Nan。
为啥呢,我们先思考一下等号左右两边的对象,上面的两个对象显然都是Series,那么按照广播机制根据index直接赋值没问题;下面的两个对象显然都是DataFrame,我们常用的df[[‘a’,‘b’]] = df[[‘c’,‘d’]]是没有问题的,但是加入条件之后为什么不行,我只能理解成pandas内部对多列的整列赋值做了优化,然而对于有条件的多列,由于列名不一致,广播机制并不起作用。
初步分析,问题在于列名,于是我们想办法拿掉列名就好了

pandas有条件的对多列进行赋值_第4张图片

可以看到a/b列的2/4成功的替换掉了,同理加上.values用where或者其他方法也可以的。

你可能感兴趣的:(工作,学习,pandas,python,数据分析)