使df.apply成为索引和列函数的最佳方法

时间:2016-06-16 08:28:24

标签: python pandas

我希望将单个函数以元素方式应用于DataFrame。我也希望这个函数将当前列和索引作为参数。

例如:

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提取列名称或索引名称,但不能同时使用applymapIn [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) ...: 仅将标量值传递给函数。

这是迄今为止我做过的最好的尝试。它很慢(而且不是很优雅),我会喜欢其他的建议:

$(document).ready(function () {
    var year = $("#id_year");
    year.datepicker({
        format: " yyyy", // Notice the Extra space at the beginning
        viewMode: "years", 
        minViewMode: "years",
        onSelect: function(dateText) {
          console.log(dateText);
          var startDate = new Date(dateText);
          year.val(startDate.getFullYear());
          console.log(year.val());
        }
    });
   /* year.on('changeDate', function(ev){
        console.log("ssds");
        year.val(ev.date.getFullYear());
      console.log(year.val());
    });*/
   
});

1 个答案:

答案 0 :(得分:1)

一个想法是使用数据框的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]