我正在尝试将函数应用于熊猫数据框,我想要应用的函数是创建一个以“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”。提前致谢
答案 0 :(得分:2)
对于 pandas
,您希望尽可能避免 apply
,而是在整个 Series
或 DataFrame
上使用矢量化操作。如果可能,您的方法签名应该接受一个系列,操作该系列,然后返回一个您可以分配回来的系列,或者接受 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)