Python 利用熊猫来;applymap“;是否可以访问索引/列?

Python 利用熊猫来;applymap“;是否可以访问索引/列?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我目前正在处理一些涉及熊猫的事情,我想知道解决以下问题最有效的方法是什么。这里有一个简化的例子 假设我在数据框中有一些数据: import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['a','b','c','d'], index=np.random.randint(0,10,size=10)) 此数据如下所

我目前正在处理一些涉及熊猫的事情,我想知道解决以下问题最有效的方法是什么。这里有一个简化的例子

假设我在数据框中有一些数据:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['a','b','c','d'], 
                  index=np.random.randint(0,10,size=10))
此数据如下所示:

   a  b  c  d
1  0  0  9  9
0  2  2  1  7
3  9  3  4  0
2  5  0  9  4
1  7  7  7  2
6  4  4  6  4
1  1  6  0  0
7  8  0  9  3
5  0  0  8  3
4  5  0  2  4
现在我想对数据帧中的每个值(例如下面的值)应用一些函数,并将数据帧作为结果输出返回。棘手的是,我正在应用的函数取决于我当前所在索引的值

def f(cell_val,row_val):
    try:
        return cell_val/row_val
    except ZeroDivisionError:
        return -1
通常,如果我想对数据帧中的每个单元格应用一个函数,我只需调用“f”上的applymap。即使我必须传入第二个参数(在本例中是row_val),如果该参数是一个固定数,我也可以编写一个lambda表达式,例如“lambda x:f(x,I)”,其中我是我想要的固定数。但是,我的第二个参数根据当前调用函数的数据帧中的行而变化,这意味着我不能只使用applymap

我怎样才能有效地解决这样的问题?我可以想出一些方法来做到这一点,但没有一种感觉是“正确的”。我可以循环遍历每个单独的值并逐个替换它们,但这看起来非常笨拙和缓慢。我还可以创建一个包含(单元格值、行值)元组的完全独立的数据框,并在元组数据框上使用内置的applymap。但这似乎很有技巧,我还额外创建了一个完全独立的数据帧

必须有更好的解决方案(最好是快速解决方案,因为我的数据帧可能非常大)。

IIUC您可以与
axis=0
一起使用,另外您需要使用以下方法将
索引
对象转换为
系列
对象:


此外,由于被零除会产生
inf
结果,您需要调用以将这些行替换为
-1

以下是如何将索引添加到数据帧中

pd.DataFrame(df.values + df.index.values[:, None], df.index, df.columns)

很抱歉,您正在寻找:
df.div(df.index.to_series(),axis=0)
?这在示例中是有效的,但是如果我有一个比简单除法更复杂的函数,它可能会在某个时候出错呢?然后我就不能在我的数据帧上调用pandas.div了。你需要解释一下这会如何失败,因为它处理
0
除法。例如,我的函数没有执行除法,而是在另一个数据帧中查找,我需要用其他东西替换索引器。类似于“def(x,y):try:return df2.iloc[x,y],但indexer除外:return-1”的情况下,您可以只测试索引的交集以及索引不同的地方return
-1
,例如
common=df1.index.intersect(df2.index)
然后您可以很好地使用公共行值,其余的返回
-1
并且您所问的与您的问题根本不同,因此您应该问另一个问题
pd.DataFrame(df.values + df.index.values[:, None], df.index, df.columns)