【问题标题】:Pandas apply function熊猫应用功能
【发布时间】:2021-04-30 14:13:12
【问题描述】:

我正在尝试将函数应用于熊猫数据框,我想要应用的函数是创建一个以“abc”为值的新列。但输出不是我所期望的。这是输入和输出的代码:

import pandas as pd

df = pd.read_csv("test.csv")
print(df)

# Initial Dataframe
#      name  age
# 0    alex   25
# 1  audrey   22

def add_one(df):
    return df + 1

def create_col(df):
    df["new_col"] = 'abc'


df["age_1_year"] = df["age"].apply(add_one)
df["my_col"] = df.apply(create_col)
print(df)

#      name  age  age_1_year my_col
# 0    alex   25          26    NaN
# 1  audrey   22          23    NaN

我希望在我的列“my_col”中有“abc”,但我得到了“NaN”。提前致谢

【问题讨论】:

  • 您不需要apply。直接使用df["my_col"] = 'abc' ?
  • 你是对的,它会起作用,但我正在尝试使用函数,因为最终这个项目会变得更大,我想要对它们进行单元测试的函数

标签: python pandas dataframe etl


【解决方案1】:

对于pandas,您希望尽可能避免apply,而是对整个SeriesDataFrame 使用矢量化操作。如果可能,您的方法签名应该接受一个系列,操作该系列,然后返回一个您可以分配回的系列,或者接受数据帧,操作数据帧并返回修改后的数据帧。

因此,如果您想创建一个函数来将一个添加到系列中,您可以这样做:

def add_one(s: pd.Series):
    return s+1

df['age_one_year'] = add_one(df['age'])
#     name  age  age_one_year
#0    alex   25            26
#1  audrey   22            23

如果你想要一个创建静态值的函数,你可以传递并返回 DataFrame:

def add_static_column(df: pd.DataFrame, col_name, static_val):
    df[col_name] = static_val
    return df

df = add_static_column(df, 'new_col', 'abc')
#     name  age  age_one_year new_col
#0    alex   25            26     abc
#1  audrey   22            23     abc

【讨论】:

    【解决方案2】:

    你不能这样做吗:

    df["age_1_year"] = df["age"] +1
    
    df["my_col"] = 'abc'
    

    【讨论】:

    • 是的,它会工作,但我正在尝试在这里使用函数,因为最终我很想对我的函数进行单元测试。有意义吗?
    • @AlexBrunet 您通常不会使用apply 创建新列。它用于将函数应用于每个现有行,而不是创建新行。我知道您想对其进行测试,但这不是 apply 的用途。
    【解决方案3】:

    这样有帮助吗?

    
    import pandas as pd
    
    
    d = {'age': [25, 22]}
    
    def add_one(x):
        return x + 1
    
    def create_col(row):
        row['my_col'] = 'abc'
        return row
    
    df = pd.DataFrame(d, columns=['age'])
    df["age_1_year"] = df["age"].apply(add_one)
    df = df.apply(create_col, axis=1)
    
    print(df)
    
       age  age_1_year my_col
    0   25          26    abc
    1   22          23    abc
    

    【讨论】:

      【解决方案4】:
      import pandas as pd
      
      df = pd.read_csv("test.csv")
      print(df)
      
      # Initial Dataframe
      #      name  age
      # 0    alex   25
      # 1  audrey   22
      
      def add_one(df):
          return df + 1
      
      def create_col(df):
          return 'abc'
      
      
      df["age_1_year"] = df["age"].apply(add_one)
      df["my_col"] = df.apply(lambda x: create_col(x), axis=1)
      ##can also do
      ##df["my_col"] = df.pipe(create_col)
      

      【讨论】:

        猜你喜欢
        • 2015-09-30
        • 2017-03-29
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 2018-02-16
        • 2018-08-29
        相关资源
        最近更新 更多