我的问题是一个大数据框架,我想清除。对我来说两个主要问题是:
整个数据框是基于时间的。这意味着我无法移动行,否则,时间戳将不再适合。
数据并不总是以相同的顺序。
这是一个澄清的例子
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的左半部分可能存在不同的数据。
答案 0 :(得分:1)
这可能不是最通用的解决方案,但它可以解决您的问题:
首先,隔离右半部分:
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])
您需要删除索引,否则pandas将尝试重新排列数据。原始索引在最后重新应用(但仅限于每个第二个索引标签),以便于重新插入左半部分和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