如何简洁地创建新列作为 zip 函数的输出?
How to concisely create new columns as output from a zip function?
我有一个要向其添加新列的数据框。我正在使用 zip
的输出来执行此操作,该输出使用函数的输出。如下所示:
该函数生成 4 个新列,我正尝试将其添加到现有数据框中。
data = [
[1, 123],
[2, 123454],
[3, 64564],
]
df = pd.DataFrame(data, columns=["ID", "number"])
# function
def func(num):
double = num * 2
triple = num * 3
quadruple = num * 4
tenex = num * 10
return double, triple, quadruple, tenex
# apply function to create 4 new columns
df["double"], df["triple"], df["quad"], df["tenex"] = zip(
*df["number"].apply(lambda x: func(x))
)
有更简洁的方法吗?当我只添加 4 列时没问题,但我想扩展此功能以添加 10+ 列。
我正在考虑这样的事情:
tuple(df[colname] for colname in col_list) = zip(
*df["number"].apply(lambda x: func(x))
)
但它不起作用(错误:SyntaxError: cannot assign function to call
)
我会使用字典将列名称映射到函数 - 在单个函数中完成所有计算并不会真正让您受益。
类似于:
column_mapper = {
'double': lambda x: x*2,
'triple': lambda x: x*3,
'quadruple': lambda x: x*4,
}
data = [
[1, 123],
[2, 123454],
[3, 64564],
]
df = pd.DataFrame(data, columns=["ID", "number"])
for column_name, func in column_mapper.items():
df[column_name] = df['number'].apply(func)
只要 cols 列表的顺序与 func 中返回的元组的顺序相同,enumerate 就可以工作。
cols = ['double', 'triple', 'quad', 'tenex']
for i, col in enumerate(cols):
df[col] = df["number"].apply(lambda x: func(x)[i])
将result_type='expand'
传给apply
输出到多列:
df[["double","triple","quad","tenex"]] = df.apply(lambda x: func(x['number']), axis = 1, result_type='expand')
我认为更好的方法实际上是在此处创建单独的函数。创建一个带有两个参数 x
和 n
的函数,然后使用 functools.partial
创建 single-argument 函数以与 apply
:
一起使用
from functools import partial
def multiply(x, n):
return x * n
functions = ((col, partial(multiply, n=i)) for col, i in [('double', 2), ('triple', 3), ('quadruple', 4), ('tenx', 10)])
for col, func in functions:
df[col] = df['number'].apply(func)
我有一个要向其添加新列的数据框。我正在使用 zip
的输出来执行此操作,该输出使用函数的输出。如下所示:
该函数生成 4 个新列,我正尝试将其添加到现有数据框中。
data = [
[1, 123],
[2, 123454],
[3, 64564],
]
df = pd.DataFrame(data, columns=["ID", "number"])
# function
def func(num):
double = num * 2
triple = num * 3
quadruple = num * 4
tenex = num * 10
return double, triple, quadruple, tenex
# apply function to create 4 new columns
df["double"], df["triple"], df["quad"], df["tenex"] = zip(
*df["number"].apply(lambda x: func(x))
)
有更简洁的方法吗?当我只添加 4 列时没问题,但我想扩展此功能以添加 10+ 列。
我正在考虑这样的事情:
tuple(df[colname] for colname in col_list) = zip(
*df["number"].apply(lambda x: func(x))
)
但它不起作用(错误:SyntaxError: cannot assign function to call
)
我会使用字典将列名称映射到函数 - 在单个函数中完成所有计算并不会真正让您受益。
类似于:
column_mapper = {
'double': lambda x: x*2,
'triple': lambda x: x*3,
'quadruple': lambda x: x*4,
}
data = [
[1, 123],
[2, 123454],
[3, 64564],
]
df = pd.DataFrame(data, columns=["ID", "number"])
for column_name, func in column_mapper.items():
df[column_name] = df['number'].apply(func)
只要 cols 列表的顺序与 func 中返回的元组的顺序相同,enumerate 就可以工作。
cols = ['double', 'triple', 'quad', 'tenex']
for i, col in enumerate(cols):
df[col] = df["number"].apply(lambda x: func(x)[i])
将result_type='expand'
传给apply
输出到多列:
df[["double","triple","quad","tenex"]] = df.apply(lambda x: func(x['number']), axis = 1, result_type='expand')
我认为更好的方法实际上是在此处创建单独的函数。创建一个带有两个参数 x
和 n
的函数,然后使用 functools.partial
创建 single-argument 函数以与 apply
:
from functools import partial
def multiply(x, n):
return x * n
functions = ((col, partial(multiply, n=i)) for col, i in [('double', 2), ('triple', 3), ('quadruple', 4), ('tenx', 10)])
for col, func in functions:
df[col] = df['number'].apply(func)