基本上,我试图将可怕的csv文件重新排列为可用的信息,并且我认为我试图欺骗切片过程,这导致大量索引与复制警告,最终导致错误的结果。
我有看起来像这样的数据:
lipid1 #some of the names of lipids have commas in them which is an added challenge
tissue1,1
tissue2,6
tissue3,3
tissue4,2
tissue5,5
lipid2
tissue1,24
tissue2,15
tissue3,12
tissue4,14
tissue5,10
我想让它像
tissue1 tissue2 tissue3 tissue4 tissue5
lipid1 1 6 3 2 5
lipid2 24 15 12 14 10
可以肯定的是,这是我忽略的简单解决方案,因为到目前为止,我一直在使用类似的方法:
alldata = pd.DataFrame()
for file in glob.glob("All5tissuesPos.csv"):
filename = file[:-4]
tissue = file[:-7]
dirty = pd.read_csv(filename+'.csv', sep='\n', header=None, names=['Arb'])
#data = dirty['Arb'].str.split(',',expand=True)
lipid = dirty.iloc[::6]['Arb'].copy()
#lipid = dirty.iloc[lambda x:x.index%6 == 0]['Arb'].copy()
data = dirty['Arb'].str.split(',',expand=True)
t=data[data.index %6 != 0]
tissue1 = t[t[0]== 'Tissue 1']
tissue1 ['lipid'] = lipid
alldata.append(tissue1)
tissue1.to_csv('test.csv')
最后一步的issue1确实看起来像我想要的,但是由于它实际上只是另一个数据框的一部分,而不是一个单独的数据框(无论如何,我还是认为),我得到了警告,当我添加它时,什么也没发生。这种代码应该是什么样的?是否有更快的方式一次对所有5个组织执行此操作?
您可以简化一堆。我们将使用一个技巧来创建脂质的另一列,向前填充该值,然后删除原来的行,这不再是必需的。然后,我们将通过简单的数据透视表进入您的数据集。在我的样本数据中,我有一个带有混乱名称的脂质,包括逗号。
在这里,我每隔6行使用一次,就像您的条件一样,但是如果数据比较混乱并且缺少某些行,则可以像一样轻松地使用条件.str.contains('lipid')
。
dirty = pd.read_csv('test.csv', sep='\n', header=None, names=['Arb'])
# Broadcast lipid name, drop that "header" row
dirty['lipid_name'] = dirty['Arb'].where(dirty.index%6 == 0).ffill()
dirty = dirty[dirty.index%6 != 0]
# Now we can split data properly
dirty = dirty.set_index('lipid_name')['Arb'].str.split(',', expand=True)
dirty.pivot(columns=0, values=1).rename_axis(None, axis=1)
tissue1 tissue2 tissue3 tissue4 tissue5
lipid_name
lipid11231,12312313,123123 1 6 3 2 5
lipid2 24 15 12 14 10
test.csv
lipid11231,12312313,123123
tissue1,1
tissue2,6
tissue3,3
tissue4,2
tissue5,5
lipid2
tissue1,24
tissue2,15
tissue3,12
tissue4,14
tissue5,10
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句