【问题标题】:How to create a column as function of other two?如何创建一个列作为其他两个的函数?
【发布时间】:2017-10-10 15:09:54
【问题描述】:

我有一个包含两列的数据框。我想创建第三列,如果 Col1 为空,则 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 的小大脑仍然在努力(很重要!)理解 pandas 是如何工作的;也许我很笨,也许 pandas 的文档很差,也许两者都有:)

我知道 apply 在 DataFrame 的行/列基础上工作,applymap 在 DataFrame 上以元素方式工作,而 map 在 Series 上以元素方式工作,我理解错误的出现是因为 pd.isnull 返回 T /F 数组。

但是,我不确定在这种情况下如何使用 applymap 或 map,其中另外两列是我的输入。

谢谢!

【问题讨论】:

  • 改为df['Col3'] = np.where(df.Col1.isnull(), df.Col2, df.Col1*2)

标签: python pandas dataframe


【解决方案1】:

你可以使用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

【讨论】:

    【解决方案2】:

    需要将 lambda function 中的 df 更改为 x 用于标量,而不是将 Series 作为函数的输入:

    df['col3'] = df.apply(lambda x: myf(x['col1'], x['col2']), axis= 1)
    

    另一个更快的解决方案是使用combine_firstSeries.where

    df['col3'] = df['col1'].mul(2).combine_first(df['col2'])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2023-03-22
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多