我有一个这样的数据框,
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的方式来做到这一点。某些熊猫捷径可能就是这样。
答案 0 :(得分:1)
通过Series.shift
的值进行比较,通过Series.where
或numpy.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