我目前正在玩一些涉及大熊猫的事情,我想知道解决以下问题最有效的方法是什么。这是一个简化的例子。
假设我在数据框中有一些数据:
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。但这看起来很糟糕,而且我还创建了一个完全独立的数据框架作为额外的步骤。
必须有一个更好的解决方案(一个快速的解决方案将被赞赏,因为我的数据框有可能最终非常大)。
答案 0 :(得分:2)
IIUC您可以将div
与axis=0
一起使用,还需要使用to_series
将Index
对象转换为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)