【问题标题】:pandas long (very long + index) to wide format conversionpandas long (very long + index) 到宽格式转换
【发布时间】:2020-06-10 20:44:12
【问题描述】:

我在数据框中有一个列,其中包含索引(病毒)和要制表并希望转换为宽格式的数据。

输入数据

virus1
AGCTGAGTGAG # sequence
40.1 # score 1
23 # score 2
102 # score 3
virus2
AGCTGAGTGAG # sequence
43.4 # score 1
32 # score 2
101 # score 3
virus3
AGTTGAGTGAG # sequence
41.3 # score 1
35 # score 2
100 # score 3
.... >100 inputs

数据帧输出

       sequence     score1 score2 score3
virus1 AGCTGAGTGAG  40.1   43.4   41.3
virus2 AGCTGAGTGAG  23     32     35
virus3 AGTTGAGTGAG  102    101    100

我尝试将数据导入单个数据框并将行移动到新数据框的列中

代码

df = pd.read_csv(file, sep='\n', header=None)
index_labels = df.iloc[::4].astype(str)
dfvirus = pd.DataFrame(index=labels)
dfvirus['sequence'] = df.iloc[1::5].astype(str)
dfvirus['score1'] = df.iloc[2::5].astype(float)
dfvirus['score2'] = df.iloc[3::5].astype(int)
dfvirus['score3'] = df.iloc[4::5].astype(int)

上述方法不起作用我得到 NaN 或 nan 的值,例如dfvirus['sequence'].head() 取决于输入是数字还是字符串。我可以通过构建分层索引来做到这一点,但这意味着将一个很长的索引循环到list

从长格式转换为宽格式是一个常见问题,如果您能提供一个更简单的解决方案或我在这里出错的地方,我将不胜感激。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    你可以这样做:

    df = pd.read_csv(file, sep='\n', header=None)
    
    new_df = pd.DataFrame(df.values.reshape(-1,5), 
                          columns=['virus','sequence','score1','score2','score3']
                         )
    

    输出

        virus      sequence score1 score2 score3
    0  virus1   AGCTGAGTGAG   40.1     23    102 
    1  virus2   AGCTGAGTGAG   43.4     32    101 
    2  virus3   AGTTGAGTGAG   41.3     35    100 
    

    【讨论】:

    • 酷,我不完全确定-1 部分是如何工作的,但它运作良好。谢谢
    猜你喜欢
    • 2017-05-02
    • 2020-10-08
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多