我想提出一种优雅(省时)的方法来减少冗余的数字采样数据的想法。我得到了.csv文件,其结构如下:
time, data1, data2, data3
0.1, 1, 1, 0
0.2, 1, 1, 0
0.3, 1, 1, 0
0.4, 1, 0, 0
0.5, 1, 0, 0
0.6, 1, 0, 0
0.7, 0, 1, 0
0.8, 0, 1, 0
我想以减少所有不必要的时间步长的方式减少输入数据。例如:
time, data1, data2, data3
0.1, 1, 1, 0
0.4, 1, 0, 0
0.7, 0, 1, 0
只要位码已更改,其余数据应仅包含时间步长。我已经实现了使用pandas导入csv文件并使用相应的mask和compress函数的方法。但是我的实现方式非常耗时。
这是与转换版本比较的一种方法:
df_ = df.loc[:, 'data1':]
df[~df_.eq(df_.shift()).all(1)]
time data1 data2 data3
0 0.1 1 1 0
3 0.4 1 0 0
6 0.7 0 1 0
如果第一列是索引,请使用:
df = df[df.ne(df.shift()).any(axis=1)]
print (df)
data1 data2 data3
time
0.1 1 1 0
0.4 1 0 0
0.7 0 1 0
如果第一列不是索引:
df1 = df.iloc[:, 1:]
df = df[df1.ne(df1.shift()).any(axis=1)]
print (df)
time data1 data2 data3
0 0.1 1 1 0
3 0.4 1 0 0
6 0.7 0 1 0
尝试使用groupby
:
print(df.groupby(['data1', 'data2', 'data3'], as_index=False).first())