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)