Python 如何将函数应用于数据帧中的每个元素?
这可能是一个非常基本的问题,但我在其他问题中找不到答案。我有两个用于创建2D数据帧的列表,比如: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的值作为我编写的某
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