熊猫:将组中的第一个值转换为np.nan

时间:2017-07-25 01:21:25

标签: python pandas pandas-groupby

我有以下DataFrame:

df = pd.DataFrame({'series1':['A','A','A','A','B','B','B','C','C','C','C'],
                   'series2':[0,1,10,99,-9,9,0,10,20,10,10]})
   series1  series2
0        A      0.0
1        A      1.0
2        A     10.0
3        A     99.0
4        B     -9.0
5        B      9.0
6        B      0.0
7        C     10.0
8        C     20.0
9        C     10.0
10       C     10.0

我想要的是什么:

df2 = pd.DataFrame({'series1':['A','A','A','A','B','B','B','C','C','C','C'],
                   'series2':[np.nan,1,10,99,np.nan,9,0,np.nan,20,10,10]})
   series1  series2
0        A      NaN
1        A      1.0
2        A     10.0
3        A     99.0
4        B      NaN
5        B      9.0
6        B      0.0
7        C      NaN
8        C     20.0
9        C     10.0
10       C     10.0

我有一种感觉,这可以通过使用Pandas .groupby函数来完成:

df.groupby('series1').first()
         series2
series1         
A              0
B             -9
C             10

它给了我想要转换为NaN的观察结果,但我无法找到一种方法来在原始DataFrame中轻松替换它。

这只是一个简单的例子,我工作的实际数据帧有> 8,000,000次观测。

4 个答案:

答案 0 :(得分:3)

您希望通过将其移位并与自身进行比较来查找series1中的不连续性:

df.loc[df['series1'].shift() != df['series1'], 'series2'] = np.nan

答案 1 :(得分:3)

可能有一种更为流畅的方法,但每组中的第一个元素是该组中的第0个元素,cumcount对每个组中的元素进行编号。所以:

In [19]: df.loc[df.groupby('series1').cumcount() == 0, 'series2'] = np.nan

In [20]: df
Out[20]: 
   series1  series2
0        A      NaN
1        A      1.0
2        A     10.0
3        A     99.0
4        B      NaN
5        B      9.0
6        B      0.0
7        C      NaN
8        C     20.0
9        C     10.0
10       C     10.0

答案 2 :(得分:2)

通过移动列的另一个选项:

df['series2'] = df.groupby('series1').series2.transform(lambda x: x.shift(-1).shift())

df
#  series1  series2
#0       A      NaN
#1       A      1.0
#2       A     10.0
#3       A     99.0
#4       B      NaN
#5       B      9.0
#6       B      0.0
#7       C      NaN
#8       C     20.0
#9       C     10.0
#10      C     10.0

答案 3 :(得分:2)

或者您可以使用headfirstnth通过索引切片返回相同的结果。

    df.loc[df.groupby('series1',as_index=False).head(1).index,'series2'] = np.nan
    #df.loc[df.groupby('series1',as_index=False).first().index,'series2'] = np.nan
    #df.loc[df.groupby('series1',as_index=False).nth(1).index,'series2'] = np.nan