我的问题是我想清除一个大数据框。对我来说,两个主要问题是:
整个数据帧是基于时间的。这意味着我不能四处移动行,否则,时间戳将不再适合。
数据并不总是相同的顺序。
这是一个例子来澄清
index a b c d x1 x2 y1 y2 t
0 1 2 0.2
1 1 2 0.4
2 2 4 0.6
3 1 2 1.8
4 2 3 2.0
5 1 2 3.8
6 2 3 4.0
7 2 5 4.2
结果应该看起来像这样
index a b c d x1 x2 y1 y2 t
0 1 2 2 4 0.2
1 1 2 0.4
3 1 2 2 3 1.8
5 1 2 2 3 3.8
7 2 5 4.2
这意味着我想总结一下df的右半部分,并保留第一个条目的时间戳。第二个问题是,介于df的左半部分之间的数据可能不同。
最佳答案
这可能不是最通用的解决方案,但可以解决您的问题:
首先,隔离右半部分:
r = df[['x1', 'x2', 'y1', 'y2']].dropna(how='all')
其次,使用
dropna
逐列应用压缩数据:r_compressed = r.apply(
lambda g: g.dropna().reset_index(drop=True),
axis=0
).set_index(r.index[::2])
您需要删除索引,否则熊猫将尝试重新对齐数据。原始索引会在末尾重新应用(但仅在每个第二个索引标签处重新应用),以方便重新插入左半部分和
t
列。输出(注意索引值):
x1 x2 y1 y2
0 1.0 2.0 2.0 4.0
3 1.0 2.0 2.0 3.0
5 1.0 2.0 2.0 3.0
三,隔离左半部分:
l = df[['a', 'b', 'c', 'd']].dropna(how='all')
第四,将左半部分和
t
列合并到压缩的右半部分中:out = r_compressed.combine_first(l)
out['t'] = df['t']
输出:
a b c d x1 x2 y1 y2 t
0 NaN NaN NaN NaN 1.0 2.0 2.0 4.0 0.2
1 1.0 2.0 NaN NaN NaN NaN NaN NaN 0.4
3 NaN NaN NaN NaN 1.0 2.0 2.0 3.0 1.8
5 NaN NaN NaN NaN 1.0 2.0 2.0 3.0 3.8
7 NaN NaN 2.0 5.0 NaN NaN NaN NaN 4.2