我有以下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次观测。
答案 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)
或者您可以使用head
,first
或nth
通过索引切片返回相同的结果。
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