解决以下 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
现在我想应用一些功能f
到数据帧中的每个值(例如下面的函数),并获取一个数据帧作为结果输出。棘手的部分是我正在应用的函数取决于我当前位于 的索引的值.def f(cell_val, row_val):
"""some function which needs to know row_val to use it"""
try:
return cell_val/row_val
except ZeroDivisionError:
return -1
通常,如果我想对数据框中的每个单独的单元格应用一个函数,我只需调用 .applymap()
在 f
.即使我必须传入第二个参数(在本例中为“row_val”),如果参数是固定数字,我也可以编写一个 lambda 表达式,例如 lambda x: f(x,i)
在哪里 i
是我想要的固定数字。但是,我的第二个参数取决于我当前从中调用函数的数据框中的行,这意味着我不能只使用 .applymap()
.我将如何有效地解决这样的问题?我可以想到几种方法来做到这一点,但没有一个觉得“正确”。我可以:
applymap()
在我的元组数据框中。但这似乎很老套,我还创建了一个完全独立的数据框作为额外的步骤。 最佳答案
IIUC 你可以使用 div
与 axis=0
另外,您需要转换 Index
反对 Series
对象使用 to_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
您需要调用 replace
用 -1
替换这些行
关于python - 使用 Pandas 到 "applymap"并访问索引/列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39773833/