我有一堆来自科学仪器的数据文件,它们带有校验和.我已经将文件读入组合的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 吗?

推荐答案

IIUC,您可以:

print(
    df.stack()
    .reset_index(level=1)
    .rename(columns={"level_1": "ChecksumHeaders", 0: "ChecksumValues"})
)

打印:

  ChecksumHeaders ChecksumValues
0            CH_A          CV_A1
1            CH_A          CV_A2
2            CH_B          CV_B1
3            CH_C          CV_C1

Python相关问答推荐

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

FastAPI:使用APIRouter路由子模块功能

Django序列化器没有验证或保存数据

数字梯度的意外值

如何使用上下文管理器创建类的实例?

Odoo -无法比较使用@api.depends设置计算字段的日期

LAB中的增强数组

如何根据另一列值用字典中的值替换列值

提取两行之间的标题的常规表达

acme错误-Veritas错误:模块收件箱没有属性linear_util'

Pandas 在最近的日期合并,考虑到破产

使用FASTCGI在IIS上运行Django频道

Django mysql图标不适用于小 case

从收件箱中的列中删除html格式

从嵌套的yaml创建一个嵌套字符串,后面跟着点

如何指定列数据类型

使用BeautifulSoup抓取所有链接

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

(Python/Pandas)基于列中非缺失值的子集DataFrame

导入错误:无法导入名称';操作';