假设我在python中有一个带有索引,变量和值列的数据帧。我想删除变量与前一个瞬时值相同的行。换句话说,我想获得另一个数据框,其中包含值正在变化的变量。例如,
原始数据框:
Index var val
0 x1 10
1 x2 11
2 x1 10
3 x3 12
4 x1 13
5 x3 14
6 x2 12
7 x1 14
输出表:
Index var val
0 x1 10
1 x2 11
2 x3 12
3 x1 13
4 x3 14
5 x2 12
6 x1 14
最有效的方法是什么?想象一下,如果我有很多变量(1000) 欢呼声。
答案 0 :(得分:1)
可以找到对变换的一个很好的解释here
duplicates = df.groupby('var')['val'].transform(lambda x: x.diff()==0)
df[~duplicates].reset_index(drop=True)
重复
Index
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
结果
var val
0 x1 10
1 x2 11
2 x3 12
3 x1 13
4 x3 14
5 x2 12
6 x1 14
答案 1 :(得分:0)
我找到了一步一步的方法,在排序后创建了一些True False'helper'列,然后最终重新索引它并返回所需的列。
df = df.sort_values(['var', 'val'])
df['original_index'] = df.index
df = df.reset_index()
df['varHasChanged'] = df['var'] != df['var'].shift(+1)
df['valhasChanged'] = df['val'] != df['val'].shift(+1)
df = df[~((df.varHasChanged == False) & (df.valhasChanged == False))]
df = df.sort_values(['Index'])
df = df.set_index(['Index'])
df = df[['var', 'val']]
df