python在不迭代思想数据帧的情况下对数据帧进行遍历

python在不迭代思想数据帧的情况下对数据帧进行遍历,python,numpy,pandas,dataframe,Python,Numpy,Pandas,Dataframe,我想在df中添加一列。此新df的值将取决于其他列的值。乙二醇 dc = {'A':[0,9,4,5],'B':[6,0,10,12],'C':[1,3,15,18]} df = pd.DataFrame(dc) A B C 0 0 6 1 1 9 0 3 2 4 10 15 3 5 12 18 现在我想添加另一列D,其值将取决于A、B、C的值。 例如,如果在df中进行迭代,我会: for row in df.iterrows(): if(r

我想在df中添加一列。此新df的值将取决于其他列的值。乙二醇

dc = {'A':[0,9,4,5],'B':[6,0,10,12],'C':[1,3,15,18]}
df = pd.DataFrame(dc)
   A   B   C
0  0   6   1
1  9   0   3
2  4  10  15
3  5  12  18
现在我想添加另一列D,其值将取决于A、B、C的值。 例如,如果在df中进行迭代,我会:

for row in df.iterrows():
    if(row['A'] != 0 and row[B] !=0):
         row['D'] = (float(row['A'])/float(row['B']))*row['C']
    elif(row['C'] ==0 and row['A'] != 0 and row[B] ==0):
         row['D'] == 250.0
    else:
         row['D'] == 20.0 
有没有一种方法可以在不使用for循环或使用where()或apply()函数的情况下实现这一点

谢谢

这是一个开始:

df['D'] = np.nan
df['D'].loc[df[(df.A != 0) & (df.B != 0)].index] = df.A / df.B.astype(np.float) * df.C
编辑时,您可能应该继续并将整个内容转换为浮点,除非出于某种原因您真的关心整数:

df = df.astype(np.float)

这样,您就不必不断地在call本身中转换了

apply
应该对您很有用:

In [20]: def func(row):
            if (row == 0).all():
                return 250.0
            elif (row[['A', 'B']] != 0).all():
                return (float(row['A']) / row['B'] ) * row['C']
            else:
                return 20
       ....:     


In [21]: df['D'] = df.apply(func, axis=1)

In [22]: df
Out[22]: 
   A   B   C     D
0  0   6   1  20.0
1  9   0   3  20.0
2  4  10  15   6.0
3  5  12  18   7.5

[4 rows x 4 columns]

.where
可以比
快得多。apply
,所以如果你所做的只是if/elses,那么我的目标就是
.where
。在某些情况下,当您返回标量时,
np.where
将比pandas自己的
.where
更易于使用

import pandas as pd
import numpy as np
df['D'] = np.where((df.A!=0) & (df.B!=0), ((df.A/df.B)*df.C),
          np.where((df.C==0) & (df.A!=0) & (df.B==0), 250,
          20))

   A   B   C     D
0  0   6   1  20.0
1  9   0   3  20.0
2  4  10  15   6.0
3  5  12  18   7.5

对于这样一个很小的df,你不需要担心速度。然而,在randn的10000行df上,这几乎比上面的
解决方案快2000倍。应用
解决方案:3ms vs 5850ms。也就是说,如果速度不是一个问题,那么.apply通常更容易阅读。

非常感谢!我也会喜欢这项工作
code
elif(行[[A',B']!=0和行['C']!=None)。all():我还必须检查无条件。您可能应该将那些
None
s转换为
NaN
s。您将获得更好的性能,因为它将是一个浮点数据类型而不是列,并且熊猫操作是NaN感知的。哦,好的,谢谢!!像这样的?elif(第['A',B']!=0行和第['C']!=NaN行)。all()这取决于您如何对待NaN。如果在
行['C']
NaN
时返回
NaN
,则您甚至不需要使用这种情况,因为
x*NaN
NaN
。如果要返回0,可以在
apply
ing
fund
之后执行
fillna(0)
。另外,由于各种原因,
np.nan==np.nan
总是错误的,所以您的方法不太有效。Pandas提供了
pd.isnull
函数来检查NaN。谢谢。我只是想看看它的语法是否正确。谢谢你的帮助。