使df.授权和列的函数的最佳方法



我希望将一个函数在数据范围内应用于元素。我还希望此功能作为参数当前列和索引。

例如:

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]

最新更新