如何创建列作为其他两个的功能?

时间:2017-10-10 15:09:54

标签: python pandas dataframe

我有一个包含两列的数据框。我想创建第三列,如果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,其中另外两列是我的输入。

谢谢!

2 个答案:

答案 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_firstSeries.where

df['Col3'] = df['col2'].where(df['col1'].isnull(), df['col1']*2)
<word>