Pandas数据框组合行

时间:2016-10-13 14:48:11

标签: python python-3.x pandas dataframe spyder

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

  1. 整个数据框是基于时间的。这意味着我无法移动行,否则,时间戳将不再适合。

  2. 数据并不总是以相同的顺序。

  3. 这是一个澄清的例子

    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的左半部分可能存在不同的数据。

1 个答案:

答案 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