执行与Pandasffi相反的操作

2024-09-29 19:27:33 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

df = pd.DataFrame({'player': ['LBJ', 'LBJ', 'LBJ', 'Kyrie', 'Kyrie', 'LBJ', 'LBJ'],
                   'points': [25, 32, 26, 21, 29, 21, 35]})

如何执行与ffill相反的操作,以便获得以下数据帧:

^{pr2}$

也就是说,我想用NaN直接填充重复的值。

以下是我目前所掌握的方法,但我希望有一种内置的pandas方法或更好的方法:

for i, (index, row) in enumerate(df.iterrows()):
    if i == 0:
        continue
    go_back = 1
    while True:
        past_player = df.ix[i-go_back, 'player']
        if pd.isnull(past_player):
            go_back += 1
            continue
        if row['player'] == past_player:
            df.set_value(index, 'player', value=np.nan)
        break

Tags: 数据方法godfindexifvalueback
2条回答

可能不是最有效的解决方案,但使用itertools.groupby和{}:

>>> df['player'] = list(itertools.chain.from_iterable([key] + [float('nan')]*(len(list(val))-1) 
                        for key, val in itertools.groupby(df['player'].tolist())))
>>> df
  player  points
0    LBJ      25
1    NaN      32
2    NaN      26
3  Kyrie      21
4    NaN      29
5    LBJ      21
6    NaN      35

更具体地说,这说明了它是如何工作的:

^{pr2}$

给予:

['LBJ', nan, nan]
['Kyrie', nan]
['LBJ', nan]

然后被“锁”在一起。在

ffinv = lambda s: s.mask(s == s.shift())
df.assign(player=ffinv(df.player))

  player  points
0    LBJ      25
1    NaN      32
2    NaN      26
3  Kyrie      21
4    NaN      29
5    LBJ      21
6    NaN      35

相关问题 更多 >

    热门问题