使用Pandas来" applymap"有权访问索引/列吗?

时间:2016-09-29 15:03:16

标签: 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))

此数据如下所示:

   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)&#34 ;我是我想要的固定号码。但是,我的第二个参数取决于我当前正在调用函数的数据框中的行,这意味着我不能只使用applymap。

我如何有效地解决这样的问题?我可以想到几种方法来做到这一点,但他们都没有感觉到#14;对"。我可以循环遍历每个单独的值并逐个替换它们,但这看起来真的很尴尬和缓慢。我还可以做一些事情,比如创建一个包含(单元格值,行值)元组的完全独立的数据框,并在我的元组数据框中使用内置的pandas applymap。但这看起来很糟糕,而且我还创建了一个完全独立的数据框架作为额外的步骤。

必须有一个更好的解决方案(一个快速的解决方案将被赞赏,因为我的数据框有可能最终非常大)。

2 个答案:

答案 0 :(得分:2)

IIUC您可以将divaxis=0一起使用,还需要使用to_seriesIndex对象转换为Series对象:

In [121]:
df.div(df.index.to_series(), axis=0).replace(np.inf, -1)

Out[121]:
          a         b         c         d
1  0.000000  0.000000  9.000000  9.000000
0 -1.000000 -1.000000 -1.000000 -1.000000
3  3.000000  1.000000  1.333333  0.000000
2  2.500000  0.000000  4.500000  2.000000
1  7.000000  7.000000  7.000000  2.000000
6  0.666667  0.666667  1.000000  0.666667
1  1.000000  6.000000  0.000000  0.000000
7  1.142857  0.000000  1.285714  0.428571
5  0.000000  0.000000  1.600000  0.600000
4  1.250000  0.000000  0.500000  1.000000

此外,由于inf除以-1,您需要致电replace$("#myList").scroll(function(){console.log("This is scroll");}) 替换这些行

答案 1 :(得分:0)

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

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