簡體   English   中英

如何將 function 應用於 dataframe 中的每個元素?

[英]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 並使用XY的值作為一些 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.indexx.name可以在df.apply()中傳遞給foo() ) 而不是將整個 Series ( x ) 輸入 function 並手動訪問其中的值。 如前所述,這似乎比我最初的響應更適合 OP 的用例——這在很大程度上是相同的,但將每個x系列傳遞給foo()然后負責提取x.namex.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM