我的问题是我想清除一个大数据框。对我来说,两个主要问题是:


整个数据帧是基于时间的。这意味着我不能四处移动行,否则,时间戳将不再适合。
数据并不总是相同的顺序。


这是一个例子来澄清

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

10-04 23:44
查看更多