pandas.DataFrame.apply 以行名称和列名称作为参数

问题描述 投票:0回答:2

有没有办法使用 apply 函数并将每个单元格的特定行和列的名称作为参数传递?换句话说,我想对两个集合的笛卡尔积进行运算。示例:

countries = ["Germany", "France", "Belgium"]
years = [2030, 2040, 2050]
df = pandas.DataFrame(columns = countries, index = years)

def myFunc(countryname, year):
   return countryname + str(year)

df.apply(myFunc) # I don't know how to pass the arguments

也许还有另一种方法可以在不使用嵌套 for 循环的情况下做到这一点?

pandas performance arguments row apply
2个回答
1
投票

不,没有,

map
这是逐元素的
apply
只获取值。

但是,您可以使用 python 循环和 DataFrame 构造函数:

out = pd.DataFrame(
    [[myFunc(c, y) for c in df.columns] for y in df.index],
    index=df.index,
    columns=df.columns,
)

输出:

          Germany      France      Belgium
2030  Germany2030  France2030  Belgium2030
2040  Germany2040  France2040  Belgium2040
2050  Germany2050  France2050  Belgium2050

请注意,如果您的操作可以矢量化,您应该使用 广播而不是嵌套循环:

df.columns.to_numpy() + df.index.astype(str).to_numpy()[:, None]

array([['Germany2030', 'France2030', 'Belgium2030'],
       ['Germany2040', 'France2040', 'Belgium2040'],
       ['Germany2050', 'France2050', 'Belgium2050']], dtype=object)

如果没有,你可以

vectorize
它:

from numpy import vectorize

@vectorize
def myFunc(countryname, year):
   return countryname + str(year)

arr = myFunc(df.columns.to_numpy(), df.index.to_numpy()[:, None])

out = pd.DataFrame(arr, index=df.index, columns=df.columns)

0
投票

一种选择是使用

pd.MultiIndex.from_product()

pd.MultiIndex.from_product([countries,years]).to_series().map('{0[0]}{0[1]}'.format).unstack(level=0)

输出:

          Belgium      France      Germany
2030  Belgium2030  France2030  Germany2030
2040  Belgium2040  France2040  Germany2040
2050  Belgium2050  France2050  Germany2050
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.