如何为Pandas DataFrame按指定数学规则生成Output列值?
给Pandas DataFrame按规则填充Output列
问题背景
已经用下面的代码创建了带A、B、C、D、Output列的DataFrame:
import numpy as np import pandas as pd data = np.random.randint(0,10,size=(10000,5)) df = pd.DataFrame(data, columns=['A', 'B', 'C','D','Output']) df.head()现在要按规则填Output列:
- 要是
A⁴ + B³ + C² + D % 2 == 0,Output就设为0- 不然就设为1
先说明个歧义点
原规则的写法有运算符优先级的问题:
- 按Python默认优先级,会先算
D%2,再和前面的A⁴+B³+C²加起来,判断总和是不是0——这种情况几乎只有A、B、C全是0,且D是偶数的时候才会触发,Output基本全是1,大概率不是你想要的。 - 更合理的需求应该是判断
A⁴+B³+C²+D的总和是不是偶数(也就是(A⁴+B³+C²+D)%2 ==0),下面分别给两种情况的实现:
情况1:严格按字面规则来
df['Output'] = np.where((df['A']**4 + df['B']**3 + df['C']**2 + df['D']%2) == 0, 0, 1)
情况2:判断总和的奇偶性(推荐)
这里有个小技巧:整数的任意正整数次幂,奇偶性和原数完全一样——比如偶数的多少次方都是偶数,奇数的多少次方都是奇数。所以A⁴的奇偶性等于A,B³等于B,C²等于C,总和的奇偶性直接等于A+B+C+D的奇偶性,计算起来更快。
写法1:直接算完整表达式
df['Output'] = ((df['A']**4 + df['B']**3 + df['C']**2 + df['D']) % 2).astype(int)
写法2:简化奇偶计算(性能更好)
df['Output'] = ((df['A'] + df['B'] + df['C'] + df['D']) % 2).astype(int)
要是非要用apply(不推荐,慢)
如果习惯用逐行处理的方式,也可以这么写,但10000行的话速度会比矢量化慢很多:
def fill_output(row): total = row['A']**4 + row['B']**3 + row['C']**2 + row['D'] return 0 if total % 2 == 0 else 1 df['Output'] = df.apply(fill_output, axis=1)
内容的提问来源于stack exchange,提问作者Emin Akdeniz
相关产品推荐
相关产品推荐

