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

Python 如何将函数应用于数据帧中的每个元素?,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,这可能是一个非常基本的问题,但我在其他问题中找不到答案。我有两个用于创建2D数据帧的列表,比如: X=np.arange(0,2.01,0.25) Y=np.arange(10,30,5.0) df=pd.DataFrame(索引=X,列=Y) 打印(df) 其中: 10.0 15.0 20.0 25.0 0.00楠楠 0.25楠楠 0.50楠楠 0.75楠楠 1.00楠楠楠 1.25楠楠 1.50楠楠 1.75楠楠 2:00楠楠 我希望遍历数据帧中的所有元素,并使用X和Y的值作为我编写的某

这可能是一个非常基本的问题,但我在其他问题中找不到答案。我有两个用于创建2D数据帧的列表,比如:

X=np.arange(0,2.01,0.25)
Y=np.arange(10,30,5.0)
df=pd.DataFrame(索引=X,列=Y)
打印(df)
其中:

10.0 15.0 20.0 25.0
0.00楠楠
0.25楠楠
0.50楠楠
0.75楠楠
1.00楠楠楠
1.25楠楠
1.50楠楠
1.75楠楠
2:00楠楠
我希望遍历数据帧中的所有元素,并使用
X
Y
的值作为我编写的某个函数
foo
的输入。例如,在第2rd行中,第一列(使用零索引)的位置我有
(X,Y)=(0.5,15.0)
,因此在这个位置我想应用
foo(0.5,15.0)
,而不是
foo(2,1)


我想我应该能够以某种方式使用
df.apply()
df.applymap()
,但我想不出来

这就是我的方法:

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

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

df.apply();而
df.applymap()
在运行时使用
df
的每个单独值,因此您不必根据需要访问索引和列名

示例

将numpy导入为np
作为pd进口熊猫
def foo(名称、索引):
返回名称-索引
x=np.arange(0,2.01,0.25)
y=np.arange(10,30,5.0)
df=pd.DataFrame(索引=x,列=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
的每个系列的列名和索引通过
df.apply()
传递给
foo()
。在
foo()
中,每个值都是通过从自己的列名值中减去自己的索引值来定义的。在这里,您可以看到,在
df.apply()
内的调用中,使用
x.index
访问每行的索引值,使用
x.name
访问列值

更新


非常感谢@SyntaxError指出
x.index
x.name
可以传递给
df.apply()
中的
foo()
,而不是将整个序列(
x
)输入函数并手动访问其中的值。如前所述,这似乎比我最初的回答更符合OP的用例——基本相同,但将每个
x
系列传递到
foo()
中,然后由
x.name
x.column
负责提取
x.name

答案很棒!要使用任意的
foo
函数实现这一点,可以使用
df.apply(lambda x:foo(x.name,x.index))
谢谢!非常有帮助的回答JPI93,然后SyntaxError您抢占了我的跟进question@SyntaxError精彩的一点,非常感谢你指出这一点:)我更新了我的答案,以反映这一点,因为它是如此干净;更广泛适用,可翻译等也是一个很好的答案,谢谢
       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