熊猫长(很长+索引)到宽格式转换

时间:2020-06-10 12:38:19

标签: python-3.x pandas

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

输入数据

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中。

从长格式到宽格式的转换是一个常见的问题,如果您能展示一个更简单的解决方案,或者我在哪里出错了,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可以这样做:

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