应用具有多个参数的函数来创建新的 Pandas 列
- 2025-02-28 08:22:00
- admin 原创
- 71
问题描述:
pandas
我想通过将函数应用于两个现有列来在数据框中创建新列。按照此答案,当我只需要一列作为参数时,我就可以创建新列:
import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
def fx(x):
return x * x
print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)
但是,当函数需要多个参数时,我不知道该怎么做。例如,如何通过将 A 列和 B 列传递给下面的函数来创建新列?
def fxy(x, y):
return x * y
解决方案 1:
如果您可以重写函数,则可以参考@greenAfrican 示例。但是,如果您不想重写函数,则可以将其包装到 apply 中的匿名函数中,如下所示:
>>> def fxy(x, y):
... return x * y
>>> df['newcolumn'] = df.apply(lambda x: fxy(x['A'], x['B']), axis=1)
>>> df
A B newcolumn
0 10 20 200
1 20 30 600
2 30 10 300
解决方案 2:
或者,您可以使用 numpy 底层函数:
>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
>>> df['new_column'] = np.multiply(df['A'], df['B'])
>>> df
A B new_column
0 10 20 200
1 20 30 600
2 30 10 300
或者在一般情况下对任意函数进行矢量化:
>>> def fx(x, y):
... return x*y
...
>>> df['new_column'] = np.vectorize(fx)(df['A'], df['B'])
>>> df
A B new_column
0 10 20 200
1 20 30 600
2 30 10 300
解决方案 3:
这解决了这个问题:
df['newcolumn'] = df.A * df.B
您还可以这样做:
def fab(row):
return row['A'] * row['B']
df['newcolumn'] = df.apply(fab, axis=1)
解决方案 4:
如果需要一次创建多个列:
创建数据框:
import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
创建函数:
def fab(row):
return row['A'] * row['B'], row['A'] + row['B']
分配新列:
df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))
解决方案 5:
再来一个字典风格的简洁语法:
df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)
或者,
df["new_column"] = df["A"] * df["B"]
解决方案 6:
这将动态地为您提供所需的结果。即使您有两个以上的参数,它也能正常工作。
df['anothercolumn'] = df[['A', 'B']].apply(lambda x: fxy(*x), axis=1)
print(df)
A B newcolumn anothercolumn
0 10 20 100 200
1 20 30 400 600
2 30 10 900 300
解决方案 7:
答案主要集中在以数据框的列作为输入的函数上。更一般地说,如果你想.apply
在具有多个参数的函数上使用 pandas,其中一些参数可能不是列,那么你可以在.apply()
调用中将它们指定为关键字参数:
def fxy(x, y):
return x * y
df['newcolumn'] = df.A.apply(fxy, y=df.B)
df['newcolumn1'] = df.A.apply(fxy, y=4)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD