我有一个数据帧:
a b c
0 nan Y nan
1 23 N 3
2 nan N 2
3 44 Y nan
Run Code Online (Sandbox Code Playgroud)
我希望得到这样的结果:
a b c d
0 nan Y nan nan
1 23 N 3 96
2 nan N 2 nan
3 44 Y nan 44
Run Code Online (Sandbox Code Playgroud)
我希望有一个条件,当列a为空时,如果列b为N且列c不为null则d为空,则列d等于列a*列c否则列d等于列a
我已经完成了这段代码,但是我得到了错误:
def f4(row):
if row['a']==np.nan:
return np.nan
elif row['b']=="N" & row(row['c'].notnull()):
return row['a']*row['c']
else:
return row['a']
DF['P1']=DF.apply(f4,axis=1)
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我指出我的错误在哪里?我已经参考了这个并尝试了这个,但也得到错误基于if-elif-else条件创建一个新列
Max*_*ner 12
用
pd.isnull(df['Description'][i])
Run Code Online (Sandbox Code Playgroud)
或者
pd.isna(df['Description'][i])
Run Code Online (Sandbox Code Playgroud)
你不需要apply,使用np.where:
df['d'] = np.where(df.a.isnull(),
np.nan,
np.where((df.b == "N")&(~df.c.isnull()),
df.a*df.c,
df.a))
Run Code Online (Sandbox Code Playgroud)
输出:
a b c d
0 NaN Y NaN NaN
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
Run Code Online (Sandbox Code Playgroud)
由于您只想Nan传播s,因此将列相乘可以为您提供:
>>> df = pd.read_clipboard()
>>> df
a b c
0 NaN Y NaN
1 23.0 N 3.0
2 NaN N 2.0
3 44.0 Y NaN
>>> df.a * df.c
0 NaN
1 69.0
2 NaN
3 NaN
dtype: float64
>>>
Run Code Online (Sandbox Code Playgroud)
如果你想在某种条件下这样做,你可以np.where在这里使用而不是.apply.您只需要以下内容:
>>> df
a b c
0 NaN Y NaN
1 23.0 N 3.0
2 NaN N 2.0
3 44.0 Y NaN
>>> np.where(df.b == 'N', df.a*df.c, df.a)
array([ nan, 69., nan, 44.])
Run Code Online (Sandbox Code Playgroud)
这是涉及的大多数操作的默认行为Nan.所以,你可以简单地分配上面的结果:
>>> df['d'] = np.where(df.b == 'N', df.a*df.c, df.a)
>>> df
a b c d
0 NaN Y NaN NaN
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
>>>
Run Code Online (Sandbox Code Playgroud)
只是详细说明这个:
np.where(df.b == 'N', df.a*df.c, df.a)
Run Code Online (Sandbox Code Playgroud)
正在做,你可以把它想象成"df.b =='N',给我结果df.a * df.c,否则,给我一个df.a:
>>> np.where(df.b == 'N', df.a*df.c, df.a)
array([ nan, 69., nan, 44.])
Run Code Online (Sandbox Code Playgroud)
另请注意,如果您的数据框架略有不同:
>>> df
a b c
0 NaN Y NaN
1 23.0 Y 3.0
2 NaN N 2.0
3 44.0 Y NaN
>>> df.loc[0,'a'] = 99
>>> df.loc[0, 'b']= 'N'
>>> df
a b c
0 99.0 N NaN
1 23.0 N 3.0
2 NaN N 2.0
3 44.0 Y NaN
Run Code Online (Sandbox Code Playgroud)
那么以下就不等同了:
>>> np.where(df.b == 'N', df.a*df.c, df.a)
array([ nan, 69., nan, 44.])
>>> np.where((df.b == 'N') & (~df.c.isnull()), df.a*df.c, df.a)
array([ 99., 69., nan, 44.])
Run Code Online (Sandbox Code Playgroud)
所以你可能想要使用稍微冗长的:
>>> df['d'] = np.where((df.b == 'N') & (~df.c.isnull()), df.a*df.c, df.a)
>>> df
a b c d
0 99.0 N NaN 99.0
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
>>>
Run Code Online (Sandbox Code Playgroud)
你可以试试
df['d'] = np.where((df.b == 'N') & (pd.notnull(df.c)), df.a*df.c, np.where(pd.notnull(df.a), df.a, np.nan))
a b c d
0 NaN Y NaN NaN
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
Run Code Online (Sandbox Code Playgroud)
请参阅有关pandas notnull 的文档,在当前代码中,只需将series.notnull更改为pd.notnull(series)即可使用。虽然np.where应该更有效
def f4(row):
if row['a']==np.nan:
return np.nan
elif (row['b']=="N") & (pd.notnull(row.c)):
return row['a']*row['c']
else:
return row['a']
df['d']=df.apply(f4,axis=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12915 次 |
| 最近记录: |