使用行号计算Pandas DataFrame中的新列

时间:2018-09-20 12:11:18

标签: pandas loops dataframe apply

我正在尝试为A和B创建两个新的概率分布列,它们需要遵循时间序列(在此处建立索引)。

from scipy.stats import poisson
from datetime import timedelta
import pandas as pd
import numpy as np

p = 4.0
q = 5.0
a = np.array([0,0,0,1,0])
b = np.array([0,0,1,1,0])
d = {'A':a, 'B':b}
Time_Interval = pd.timedelta_range('11:00:00', periods=5, freq='10T')
df = pd.DataFrame(d, Time_Interval)

新的col A'(对应于A)的生成如下

so when i = 1 ==> poisson.pmf(0, p*1/5)
        i = 2 ==> poisson.pmf(0, p*2/5)
        i = 3 ==> poisson.pmf(0, p*3/5)
        i = 4 ==> poisson.pmf(1, p*4/5)
        i = 5 ==> poisson.pmf(0, p*5/5)

我尝试了以下方法。

df["A'"] = df.A.apply(lambda v : poisson.pmf(v, p*i/len(df)) for i in list(range(1,1+len(df['A']))))
df["B'"] = df.B.apply(lambda x : poisson.pmf(x, q*j/len(df)) for j in list(range(1,1+len(df['B']))))


## list(range(1, len(df['A']))) creates the index i for the i/len(df) term inside the poisson func. for i [1,2,3,4,5]. 

但是我会收到以下错误消息。

TypeError: 'generator' object is not callable

结果应如下所示

df
Out[358]: 
               A       B   A'         B'
11:00:00       0       0  0.449329  0.367879
11:10:00       0       0  0.201897  0.135335
11:20:00       0       1  0.090718  0.149361
11:30:00       1       1  0.130439  0.073263
11:40:00       0       0  0.018316  0.006738

1 个答案:

答案 0 :(得分:1)

您的i值必须是提供v参数的行索引。您拥有的代码会遍历每次计算中的所有行。

要解决此问题,您需要在数据框中添加行号:

d = {'t': Time_Interval, 'A':a, 'B':b}
df = pd.DataFrame(d)

然后,您可以处理整行并查找行号(row.name):

def func(row):
    i = row.name + 1
    return poisson.pmf(row['A'], p*i/len(df))

df["A'"] = df.apply(func, axis=1)

我将留给您处理B栏。 (提示:您可以将args传递给apply,并将它们附加到func的参数中。)