[英]How to apply a function to every element in a dataframe?
這可能是一個非常基本的問題,但我在其他問題中找不到答案。 我有兩個列表用於創建 2D dataframe,比如說:
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
我想通過 dataframe 中的所有元素 go 並使用X
和Y
的值作為一些 function, foo
的輸入。 例如,在第二行第一列(使用零索引) position 我有(X, Y) = (0.5, 15.0)
,所以在這個 position 我想申請foo(0.5, 15.0)
15.02) 而不是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)
output:
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()
可以訪問代表每一行/列(取決於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))
Output
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
的每個 Series 的列名和索引通過df.apply()
傳遞給foo()
) 。 在foo()
中,每個值都是通過從它自己的列名值中減去它自己的索引值來定義的。 在這里,您可以看到每行的索引值是使用x.index
訪問的,而列值是在df.apply()
的調用中使用x.name
訪問的。
更新
非常感謝@SyntaxError 指出x.index
和x.name
可以在df.apply()
中傳遞給foo()
) 而不是將整個 Series ( x
) 輸入 function 並手動訪問其中的值。 如前所述,這似乎比我最初的響應更適合 OP 的用例——這在很大程度上是相同的,但將每個x
系列傳遞給foo()
然后負責提取x.name
和x.column
。
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]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.