forwardfill与python pandas中的计算(method ='ffill'* xyz)相结合

时间:2015-06-04 10:33:32

标签: python pandas

我需要用计算填充NaN空格,这取决于dataframe = df中的先前值。到目前为止我所拥有的是:

df = pd.DataFrame({'a': [None] * 6, 'b': [2, 3, 10, 3, 5, 8]})
df["c"] =np.NaN

df["c"][0] = 1
df["c"][2] = 3

i = 1
while i<10:
    df.c.fillna(df.c.shift(i)*df.b,inplace=True)
    i+1

不幸的是,这个while循环的解决方案不起作用,对熊猫来说肯定是一个非常糟糕的解决方案。所以我正在寻找的是一种

df.c.fillna(method='ffill'*df.b,inplace=True)

我知道这也行不通,我只是认为这样可以让我更清楚我要找的东西。

在填写数据框之前,它看起来像这样:

   b   c
0  2   1
1  3 NaN
2 10   3
3  3 NaN
4  5 NaN
5  8 NaN

期望的结果应如下所示:

      b   c
0     2   1  # nothing filled in since data is set from df["c"][0] = 1
1     3   3  # fill in previous c * b = 1 * 3 = 3
2    10   3  # nothing filled in since data is set from df["c"][2] = 3
3     3   9  # fill in previous c * b = 3 * 3 = 9
4     5  45  # fill in previous c * b = 9 * 5 = 45
5     8 360  # fill in previous c * b = 45 * 8 = 360

所以基本上:如果没有数据可用,则应填充计算。

1 个答案:

答案 0 :(得分:4)

我无法弄清楚在单个循环中执行此操作的方法,这里的问题是您需要某种滚动应用,然后可以查看上一行,这里的问题是前一行更新将在apply完成之前不可观察,例如以下工作,因为我们运行3次应用。这不是很好的IMO:

In [103]:
def func(x):
    if pd.notnull(x['c']):
        return x['c']
    else:
        return df.iloc[x.name - 1]['c'] * x['b']
df['c'] = df.apply(func, axis =1)
df['c'] = df.apply(func, axis =1)
df['c'] = df.apply(func, axis =1)
df

Out[103]:
      a   b    c
0  None   2    1
1  None   3    3
2  None  10    3
3  None   3    9
4  None   5   45
5  None   8  360