如何将函数应用于数据框中的每个元素?

3

这可能是一个非常基础的问题,但我在其他问题中找不到答案。我有两个列表,用它们创建了一个二维数据帧,假设如下:

X= np.arange(0, 2.01, 0.25)
Y= np.arange(10, 30, 5.0) 

df = pd.DataFrame(index = X, columns = Y)
print(df)

这将会得到:

     10.0 15.0 20.0 25.0
0.00  NaN  NaN  NaN  NaN
0.25  NaN  NaN  NaN  NaN
0.50  NaN  NaN  NaN  NaN
0.75  NaN  NaN  NaN  NaN
1.00  NaN  NaN  NaN  NaN
1.25  NaN  NaN  NaN  NaN
1.50  NaN  NaN  NaN  NaN
1.75  NaN  NaN  NaN  NaN
2.00  NaN  NaN  NaN  NaN

我想遍历数据框中的所有元素,并将 XY 的值作为输入参数传递给我编写的某个函数 foo,比如在第二行第一列(使用零索引)位置上,我有 (X, Y) = (0.5, 15.0),因此在这个位置上我想应用 foo(0.5, 15.0) 而不是 foo(2, 1)
我认为我应该可以使用 df.apply()df.applymap(),但我搞不清楚怎么做!
3个回答

4

由于您的问题需要访问df的索引和列标签,您可能需要使用df.apply()

df.apply()可以访问每行/列(取决于axis参数值)的pandas.Series,并且您将可以访问列名和索引;而df.applymap()在运行时使用df的每个单独值-因此您不一定能够访问所需的索引和列名。

示例

import numpy as np
import pandas as pd 

def foo(name, index):
    return name - index

x = np.arange(0, 2.01, 0.25)
y = np.arange(10, 30, 5.0) 

df = pd.DataFrame(index = x, columns = y)

df.apply(lambda x: foo(x.name, x.index))

输出结果

       10.0   15.0   20.0   25.0
0.00  10.00  15.00  20.00  25.00
0.25   9.75  14.75  19.75  24.75
0.50   9.50  14.50  19.50  24.50
0.75   9.25  14.25  19.25  24.25
1.00   9.00  14.00  19.00  24.00
1.25   8.75  13.75  18.75  23.75
1.50   8.50  13.50  18.50  23.50
1.75   8.25  13.25  18.25  23.25
2.00   8.00  13.00  18.00  23.00

在上面的示例中,由df.apply()传递给foo()的是constitutingdf的每个Series的列名和索引。在foo()中,每个值都是通过它自己的索引值从它自己的列名值中减去定义的。在df.apply()的调用中,您可以看到每行的索引值使用x.index访问,列值使用x.name访问。

更新

非常感谢@SyntaxError指出,可以在df.apply()内部将x.indexx.name传递给foo(),而不是将整个Series(x)馈送到函数中并在其中手动访问值。如上所述,这似乎比我的原始响应更加整洁,但我的原始响应基本相同,它将每个x系列传递到foo()中,然后有责任提取x.namex.column


1
用一个任意的 foo 函数,它接受 2 个值,可以实现这个目标: df.apply(lambda x: foo(x.name, x.index)) - SyntaxError
谢谢!JPI93的回答非常有帮助,然后SyntaxError你预先回答了我的后续问题。 - havingaball
@SyntaxError 很棒的观点,非常感谢你指出这一点 :) 我已经更新了我的答案以反映这一点,因为它更加简洁、适用范围更广、可翻译等等。 - JPI93
@JPI93我相信你的代码是有效的;但是当我把它复制到colab时,它返回NaN,我不明白为什么... - undefined

2
这是我的做法:
from itertools import product

def foo(row, col):
    return row * col

for row, col in product(df.index, df.columns):
    df.loc[row, col] = foo(row, col)

输出:

      10.0   15.0 20.0   25.0
0.00     0      0    0      0
0.25   2.5   3.75    5   6.25
0.50     5    7.5   10   12.5
0.75   7.5  11.25   15  18.75
1.00    10     15   20     25
1.25  12.5  18.75   25  31.25
1.50    15   22.5   30   37.5
1.75  17.5  26.25   35  43.75
2.00    20     30   40     50

0
    X= np.arange(0, 2.01, 0.25)
    Y= np.arange(10, 30, 5.0) 

    df = pd.DataFrame(index = X, columns = Y)

    # example of function
    def foo(x, y):
        return x*y

    # apply the fonction to each element of the data frame getting the raw and the column name as parameters
    for i in range(df.shape[0]):
    for j in range(df.shape[1]):
        df.iloc[i,j] = foo (float(df.columns[j]),float(df.index[i]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接