我在数据框内只有一列,其中既包含索引(病毒)又包含要制表的数据,并希望转换为宽格式。
输入数据
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
中。
从长格式到宽格式的转换是一个常见的问题,如果您能展示一个更简单的解决方案,或者我在哪里出错了,我将不胜感激。
答案 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