有没有办法使用 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 循环的情况下做到这一点?
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
请注意,如果您的操作可以矢量化,您应该使用 numpy 广播而不是嵌套循环:
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)
一种选择是使用
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