【问题标题】:Transformation of pandas DataFrame adds a blank rowpandas DataFrame 的转换增加了一个空白行
【发布时间】:2017-04-05 01:09:29
【问题描述】:

我最初的问题已发布here。我有一个如下的数据框:

ID  START   END  SEQ
1   11      12   1
1   14      15   3 
1   13      14   2 
2   10      14   1
3   11      15   1
3   16      17   2

我想把它转换成这个DataFrame:

ID  START_1  END_1  SEQ_1  START_2  END_2  SEQ_2 START_3  END_3  SEQ_3
1   11       12     1      13       14     2     14       15     3 
2   10       14     1      NA       NA     NA    NA       NA     NA   
3   11       15     1      16       17     2     NA       NA     NA 

pivot_table 转换后,我收到了一个 DataFrame,它在标题之后有一个额外的空白行:

test_2['SEQ1'] = test_2.SEQ
test_2 = test_2.pivot_table(index= ['ID','SEQ1']).unstack()
test_2 = test_2.sort_index(axis=1, level=1)
test_2.columns = ['_'.join((col[0], str(col[1]))) for col in test_2]
test_2

test_2

    START_1  END_1  SEQ_1  START_2  END_2  SEQ_2 START_3  END_3  SEQ_3
ID
1   11       12     1      13       14     2     14       15     3 
2   10       14     1      NA       NA     NA    NA       NA     NA   
3   11       15     1      16       17     2     NA       NA     NA 

如何删除这些行并对齐所有标题?我尝试使用test2[:2] 以传统方式删除该行,但它没有删除空白行。

编辑:

这是更真实的数据集的提取:

ID  INDEX           START                   END                 SEQ     NUM_PREV     NUM_ACTUAL   NUM_NEXT             TIME   PRE_TIME      LOC_IND
079C    333334.0    2016-06-23 12:45:32 2016-06-23 12:51:05 1   1      23456           25456           29456           30      2               YES
079C    333334.0    2016-06-23 12:47:05 2016-06-23 12:51:05 2   2     29456           39458           39945           20      0               NO

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    考虑在枢轴/取消堆栈操作后重置索引:

    from io import StringIO
    import pandas as pd
    
    data='''
    ID  START   END  SEQ
    1   11      12   1
    1   14      15   3 
    1   13      14   2 
    2   10      14   1
    3   11      15   1
    3   16      17   2
    '''
    
    test_2 = pd.read_table(StringIO(data), sep="\\s+")
    seq = set(test_2['SEQ'].tolist())
    
    test_2['SEQ1'] = test_2.SEQ
    test_2 = test_2.pivot_table(index= ['ID','SEQ1']).unstack()
    test_2 = test_2.sort_index(axis=1, level=1)
    test_2.columns = ['_'.join((col[0], str(col[1]))) for col in test_2]
    
    test_2 = test_2.reset_index()
    #    ID  END_1  SEQ_1  START_1  END_2  SEQ_2  START_2  END_3  SEQ_3  START_3
    # 0   1   12.0    1.0     11.0   14.0    2.0     13.0   15.0    3.0     14.0
    # 1   2   14.0    1.0     10.0    NaN    NaN      NaN    NaN    NaN      NaN
    # 2   3   15.0    1.0     11.0   17.0    2.0     16.0    NaN    NaN      NaN
    

    但是,如您所见,它会更改列顺序,因此请考虑使用 sum() 的嵌套列表推导将其展平,所有这些都是为了合适的顺序:

    seqmax = max(seq)+1
    colorder = ['ID'] +  sum([['START_'+str(i),'END_'+str(i),'SEQ_'+str(i)]
                         for i in range(1, seqmax) if i in seq],[])
    
    test_2 = test_2[colorder]
    
    #    ID  START_1  END_1  SEQ_1  START_2  END_2  SEQ_2  START_3  END_3  SEQ_3
    # 0   1     11.0   12.0    1.0     13.0   14.0    2.0     14.0   15.0    3.0
    # 1   2     10.0   14.0    1.0      NaN    NaN    NaN      NaN    NaN    NaN
    # 2   3     11.0   15.0    1.0     16.0   17.0    2.0      NaN    NaN    NaN
    

    【讨论】:

    • 我收到错误 KeyError not in index。而且应该有idmax = max(test_2['SEQ'])+1
    • 不太确定该错误源自何处。我更新了我的帖子,展示了我如何复制您的数据和数据透视代码(完全按照您发布的方式使用)。也许您的实际数据不同。
    • 我的真实数据集中只有更多列,例如ID START END SEQ TIME DATE ...。出于某种原因,第一种方法不包括新数据框中的某些列,这就是我的误解。为什么不包括所有列?而第二种方法可能不会假设ID 可能是像11A 这样的非数字。
    • 知道了。见更新。只需运行reset_index() 并确保捕获序列列表。请参阅 seq = set(test_2['SEQ'].tolist()) 之前的数据透视/取消堆叠,以便稍后用于列排序。
    • 抱歉,seq 在第一个解决方案中使用的位置?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多