熊猫应用功能

时间:2021-04-30 14:13:12

标签: python pandas dataframe etl

我正在尝试将函数应用于熊猫数据框,我想要应用的函数是创建一个以“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”。提前致谢

4 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

你不能这样做吗:

df["age_1_year"] = df["age"] +1

df["my_col"] = 'abc'

答案 2 :(得分:1)

这样的事情有帮助吗?


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

答案 3 :(得分:1)

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)