我认为我的问题很容易理解,但我不知道如何在没有循环的情况下有效地做到这一点。
我的数据集(已经按ID和值排序)有ID,一些特征和值列(整数)我的目标是保持所有连续的值从第一次出现相同的ID,如果只有一个ID保持那个。
我认为用一个例子更容易理解让我给你们展示一下,我的数据集是这样的:
d = {'Id': [1, 1, 1, 1, 2, 3, 3, 3], 'Feature': ['F1', 'F1', 'F1', 'F1', 'F2', 'F3', 'F3', 'F3'], 'Value': [1, 2, 4, 5, 2, 15, 16, 18]}
df = pd.DataFrame(data=d)
Id Feature Value
0 1 F1 1
1 1 F1 2
2 1 F1 4
3 1 F1 5
4 2 F2 2
5 3 F3 15
6 3 F3 16
7 3 F3 18
注意:重复项已经被删除。注2:对于相同的ID,功能总是相同的,并且可能与其他ID重合。
我的目标是让这个返回:
Id Feature Value
0 1 F1 1
1 1 F1 2
4 2 F2 2
5 3 F3 15
6 3 F3 16
PS:如果有语法错误,请提前道歉,英语不是我的母语。
使用DataFrameGroupBy.diff
,用1
代替每行的缺失值,对不相等的1
进行比较,用Series.cumsum
进行累积和,用1
进行比较,并在boolean indexing
中进行过滤:
df = df[df.groupby('Id')['Value'].apply(lambda x: x.diff().ne(1).cumsum()).eq(1)]
print (df)
Id Feature Value
0 1 F1 1
1 1 F1 2
4 2 F2 2
5 3 F3 15
6 3 F3 16