我希望将一个函数在数据范围内应用于元素。我还希望此功能作为参数当前列和索引。
例如:
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: df = pd.DataFrame(np.arange(4).reshape(2, 2), index=['a', 'b'], columns=['c', 'd'])
In [4]: df.head()
Out[4]:
c d
a 0 1
b 2 3
现在我想要以下内容:
f = lambda x: foo(x, x.index_value, x.column_name)
df.apply(f)
在我的特定用例中,我还有其他数据结构/功能,这些功能在这些值上键入。到目前为止,我尝试过的一切都失去了至少一个信息级别。
这是一个示例foo()
:
def foo(x, idx, col):
# get data
a = a_data.loc[idx, col]
b = b_data.loc[idx, col]
return a * x + b
例如,我可以使用apply
并使用x.name
提取列名称或索引名称,但不能同时提取 - applymap
仅将标量值传递给函数。
这是我迄今为止做出的最好的尝试。这很慢(不是很优雅),我会喜欢其他建议:
In [4]: import itertools
In [5]: newdf = df.copy()
In [6]: for idx, col in itertools.product(df.index.values, df.columns):
...: newdf.loc[idx, col] = f(df.loc[idx, col], idx, col)
...:
一个想法是使用数据框的at
方法。loc
也可以工作,但速度较慢。
foo = dict(a=1, b=2)
bar = dict(c=3, d=4)
for i in df.index:
for j in df.columns:
df.at[i, j] += foo[i] + bar[j]