数据框取上一行的值

时间:2020-07-09 09:01:09

标签: python pandas dataframe

我有一个如下数据框:

idx  prev_val  val  type
 0      nan     8    a
 1      nan     9    a
 2      nan     7    a
 0      nan     3    b
 1      nan     1    b
 0      nan     2    c
 1      nan     7    c
 2      nan     5    c
 3      nan     4    c

我希望对于每种类型,对于idx> 0的每一行,将从上一行的prev_val中获取val的值。因此,新的数据框将是:

idx  prev_val  val  type
 0      nan     8    a
 1       8      9    a
 2       9      7    a
 0      nan     3    b
 1       3      1    b
 0      nan     2    c
 1       2      7    c
 2       7      5    c
 3       5      4    c

做到这一点的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

您可以尝试使用np.where

df['prev_val']=np.where(df['idx']!=0, df.val.shift(),np.nan)

答案 1 :(得分:1)

typeshift的{​​{1}}列上使用DataFrame.groupby,然后使用val将值分配给prev_val列:

boolean indexing

结果:

df.loc[df['idx'].gt(0), 'prev_val'] = df.groupby('type')['val'].shift()

答案 2 :(得分:0)

您可以使用groupbyshift

df['prev_val'] = df.groupby('type')['val'].shift()

0   0      NaN   8    a
1   1        8   9    a
2   2        9   7    a
3   0      NaN   3    b
4   1        3   1    b
5   0      NaN   2    c
6   1        2   7    c
7   2        7   5    c
8   3        5   4    c

请注意,如@jezrael所述,如果每个组都以idx = 0开头,则此解决方案有效。

答案 3 :(得分:0)

最好是使用像这样的Pandas fillna函数:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html

df.fillna(method='ffill')