用NAN值替换重复数字,但第一个值在熊猫列中

时间:2019-10-24 09:59:44

标签: python pandas dataframe

我有一个这样的数据框,

df
col1    col2
  1       A
  2       A
  3       B
  4       C
  5       C
  6       C
  7       B
  8       B
  9       A

现在我们可以看到A,B和C连续出现。我只希望出现开始的行。并且同一事件的其他值将为nan。

我正在寻找的最终数据帧看起来像

df
col1    col2
  1       A
  2       NA
  3       B
  4       C
  5       NA
  6       NA
  7       B
  8       NA
  9       A

我可以使用for循环并进行比较,但是执行时间会更多。我正在寻找pythonic的方式来做到这一点。某些熊猫捷径可能就是这样。

1 个答案:

答案 0 :(得分:1)

通过Series.shift的值进行比较,通过Series.wherenumpy.where的缺失值进行比较:

df['col2'] = df['col2'].where(df['col2'].ne(df['col2'].shift()))
#alternative
#df['col2'] = np.where(df['col2'].ne(df['col2'].shift()), df['col2'], np.nan)

或以~颠倒条件的DataFrame.loc

df.loc[~df['col2'].ne(df['col2'].shift()), 'col2'] = np.nan

或者,谢谢@Daniel Mesejo-将eq用于==

df.loc[df['col2'].eq(df['col2'].shift()), 'col2'] = np.nan

print (df)
   col1 col2
0     1    A
1     2  NaN
2     3    B
3     4    C
4     5  NaN
5     6  NaN
6     7    B
7     8  NaN
8     9    A

详细信息

print (df['col2'].ne(df['col2'].shift()))
0     True
1    False
2     True
3     True
4    False
5    False
6     True
7    False
8     True
Name: col2, dtype: bool