我有一堆来自科学仪器的数据文件,它们带有校验和.我已经将文件读入组合的PANDA数据帧,但每行的校验和是为了与校验和列的列标签进行比较,并且对每个文件都是唯一的.这导致数据帧具有O10列,在列标签和列值中具有非常大的字符串(对于具有该列标签的文件中的行).现在,我需要将这些O10列合并为两列,一列用于值,另一列用于比较校验和的标题.
简化示例起始表,CH=校验和报头,CV=校验和值
CH_A | CH_B | CH_C |
---|---|---|
CV_A1 | NaN | NaN |
CV_A2 | NaN | NaN |
NaN | CV_B1 | NaN |
NaN | NaN | CV_C1 |
应合并为2列
ChecksumHeaders | ChecksumValues |
---|---|
CH_A | CV_A1 |
CH_A | CV_A2 |
CH_B | CV_B1 |
CH_C | CV_C1 |
使用df.ffill可以很容易地获得‘Checksum Values’表,但我正在努力确定一个创建‘Checksum Headers’列的好方法.鉴于'string'*1 =='string'
和'string'*0 ==''
是如何.我使用了np.sum([df[CH].notnull().astype(np.int)*CH for CH in ListOfHeaders])
的许多变体,但发现字符串*int只能作为单个等式使用,try 进行数组运算会导致如下错误:
UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U9'), dtype('int32')) -> None
因此,为了确保每次只有1个,我使用了嵌套列表理解:
如果只有几行和几列要处理,则df['ChecksumHeaders'] = [''.join([ListOfHeaders[idx]*df[CH].notnull().iloc[rowidx].astype(np.int) for idx,CH in enumerate(ListOfHeaders)]) for rowidx in np.arange(len(df))]
可以很好地工作,但当需要处理O10列和Odf['ChecksumHeaders'] = [''.join([ListOfHeaders[idx]*df[CH].notnull().iloc[rowidx].astype(np.int) for idx,CH in enumerate(ListOfHeaders)]) for rowidx in np.arange(len(df))]
k行时,则需要很长时间.肯定有更好的方法来做这件事,有什么 idea 吗?