我有一个包含两列的数据框。我想创建第三列,如果Col1为null,则Col3 = Col2,否则Col3 = Col1 * 2
我试过了:
def myf(col1,col2):
if pd.isnull(col1):
return col2
else:
return col1 * 2
df['col3'] = df.apply(lambda x: myf(df['col1'], df['col2']), axis= 1)
但是我得到一个错误“'系列的真值是模棱两可的”。
我该如何解决这个问题? 我理解这是一个平庸的问题,但是我的小脑,习惯性的SQL大脑仍然在努力(大时间!)来理解大熊猫是如何工作的;也许我非常愚蠢,也许熊猫的文件很差,可能两者都有:)
我知道apply适用于DataFrame的行/列,applymap在DataFrame上以元素方式工作,而map在系列上以元素方式工作,我理解错误的产生,因为pd.isnull返回T / F数组。
但是,我不确定如何在这样的情况下使用applymap或map,其中另外两列是我的输入。
谢谢!
答案 0 :(得分:2)
您可以使用fillna
:
df.col1.mul(2).fillna(df.col2)
df = pd.DataFrame({
'col1': [1, 2, pd.np.nan, 3, pd.np.nan],
'col2': [2, pd.np.nan, 3, 2, pd.np.nan]
})
df['col3'] = df.col1.mul(2).fillna(df.col2)
df
# col1 col2 col3
#0 1.0 2.0 2.0
#1 2.0 NaN 4.0
#2 NaN 3.0 3.0
#3 3.0 2.0 6.0
#4 NaN NaN NaN
答案 1 :(得分:1)
在df
中需要将x
更改为lambda function
,而不是将Series
替换为df['col3'] = df.apply(lambda x: myf(x['col1'], x['col2']), axis= 1)
作为函数输入:
df['col3'] = df['col1'].mul(2).combine_first(df['col2'])
另一个更快的解决方案是使用combine_first
或Series.where
:
df['Col3'] = df['col2'].where(df['col1'].isnull(), df['col1']*2)
<word>