我经常有这种需要,而且我似乎无法找到有效的方法。
我们说我有一个pandas DataFrame对象,我希望每个元素(i,j)
的值等于f(index[i], columns[j])
。
使用applymap
,每个元素的索引和列值都将丢失。
最好的方法是什么?
答案 0 :(得分:5)
这取决于你要特别做的事情。
聪明的黑客
使用pd.Panel.apply
它的工作原理是它会沿主轴和短轴迭代每个系列。它的名字将是我们需要的元组。
df = pd.DataFrame(index=range(5), columns=range(5))
def f1(x):
n = x.name
return n[0] + n[1] ** 2
pd.Panel(dict(A=df)).apply(f1, 0)
0 1 2 3 4
0 0 1 4 9 16
1 1 2 5 10 17
2 2 3 6 11 18
3 3 4 7 12 19
4 4 5 8 13 20
示例1
这是一个这样的用例和该用例的一种可能的解决方案
df = pd.DataFrame(index=range(5), columns=range(5))
f = lambda x: x[0] + x[1]
s = df.stack(dropna=False)
s.loc[:] = s.index.map(f)
s.unstack()
0 1 2 3 4
0 0 1 2 3 4
1 1 2 3 4 5
2 2 3 4 5 6
3 3 4 5 6 7
4 4 5 6 7 8
或者这将做同样的事情
df.stack(dropna=False).to_frame().apply(lambda x: f(x.name), 1).unstack()
示例2
df = pd.DataFrame(index=list('abcd'), columns=list('xyz'))
v = df.values
c = df.columns.values
i = df.index.values
pd.DataFrame(
(np.tile(i, len(c)) + c.repeat(len(i))).reshape(v.shape),
i, c
)
x y z
a ax bx cx
b dx ay by
c cy dy az
d bz cz dz