Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带if-else的lamba函数_Python_Pandas_If Statement_Dataframe_Lambda - Fatal编程技术网

Python 带if-else的lamba函数

Python 带if-else的lamba函数,python,pandas,if-statement,dataframe,lambda,Python,Pandas,If Statement,Dataframe,Lambda,我有一个数据框,看起来像: A B C D SUM 2 5 -4 12 15 我试着跑: df.apply((lambda x: x / x.sum() if x/x.sum() >= 0 else None), axis=1).fillna(0) 若要获得,若单元格总数相同,则计算x/total: A B C D 2/15 5/15 0 12/15 我得到: 'The truth value of a Ser

我有一个数据框,看起来像:

A   B   C   D   SUM 
2   5   -4  12  15
我试着跑:

df.apply((lambda x: x / x.sum() if x/x.sum() >= 0 else None), axis=1).fillna(0)
若要获得,若单元格总数相同,则计算x/total:

A         B     C   D
2/15    5/15    0   12/15
我得到:

'The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
如何改进代码

你把事情搞混了。它们是不同的方法:一种是对系列进行操作,对每个元素进行操作;另一个沿轴在数据帧上运行。在后一种情况下,沿
轴=1
表示每行按顺序馈送到函数

因为这些
apply
方法(两个版本)都是隐蔽的循环,所以在每次按列
lambda
调用之后,数据帧都会发生变化。因此,您需要使用数据帧的副本:

df2 = df.copy()

for col in df.columns[:-1]:
    df2[col] = df.iloc[:, :-1].apply(lambda x: x[col] / x.sum() if x[col]/x.sum() >= 0 \
                                     else None, axis=1).fillna(0)

print(df2)

          A         B  C    D  SUM
0  0.133333  0.333333  0  0.8   15
然而,这一切都是非常低效的。我们没有使用底层的NumPy数组。相反,您可以使用矢量化操作:

res = df.iloc[:, :-1].div(df.iloc[:, :-1].sum(1), axis=0)
res.mask(res < 0, 0, inplace=True)

print(res)

          A         B    C    D
0  0.133333  0.333333  0.0  0.8
res=df.iloc[:,:-1].div(df.iloc[:,:-1].sum(1),axis=0)
res.mask(res<0,0,原地=真)
打印(res)
A、B、C、D
0  0.133333  0.333333  0.0  0.8

什么是
x/x.sum()
应该返回的?为什么不检查一个数字是否为负数
x/x.sum()
只有在
x<0
x.sum()<0
时才会为负值?您甚至不需要
lambda
函数。您可以用
None
替换数据帧中的所有负值,并将总和<0的行设置为
None
。x/x.sum()是:单元格中的值除以行中所有单元格中的值之和。这与
if/else
lambda
无关,但一系列的值应该如何被视为布尔值,“如果单元格在总数上相同”是什么意思呢?