如何在Pandas中的一列下合并不同的列

2024-06-07 06:06:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个稀疏的数据帧

 Conti_mV_XSCI_140|Conti_mV_XSCI_12|Conti_mV_XSCI_76|Conti_mV_XSCO_11|Conti_mV_XSCO_203|Conti_mV_XSCO_75
        1         | nan            | nan            | 12             | nan             | nan
        nan       | 22             | nan            | nan            | 13              | nan
        nan       | nan            | 9              | nan            | nan             | 31

正如您所看到的,XSCI出现在3个标题名中,唯一的事情是添加了一个随机数(_140,_12,_76),这使它们有所不同

这是不对的。列名应该是这样的-Conti_mV_XSCI,Conti_mV_XSCO。 最后一个列名(不带任何随机数)应该包含它扩展到的所有三个列的值(例如-xsci是xsci_140、xsci_12、xsci_76),如下所示

最后的数据帧应该是这样的-

Conti_mV_XSCI| Conti_mV_XSCO
1            |  12
22           |  13
99           |  31

如果您注意到,XSCI的第一个值来自第一个XSCI_140,第二个值来自带有XSCI的第二列,依此类推。XSCO也是如此

问题是,我必须对所有以特定值开头的列执行此操作,如-“Conti\u mV”、“IDD\u PowerUp\u mA”

我的问题:

我很难清除标题名,因为一旦我从最后一个标题中删除随机数,它就会抛出一个列重复的错误,而且它也不优雅

如果有人能帮助我,那将是一个很大的帮助。如果这里有什么不清楚的地方,请评论

我需要一个带有一列(其中有3列)的新数据框,并组合来自它们的数据

谢谢


Tags: 数据标题地方错误评论nan事情mv
3条回答

如有必要,首先将所有列转换为数字:

df = df.apply(pd.to_numeric, errors='coerce')

如果需要按列名称分组,列名称由右侧和选定的第一个值拆分:

df = df.groupby(lambda x: x.rsplit('_', 1)[0], axis=1).sum()
print (df)
   Conti_mV_XSCI  Conti_mV_XSCO
0            1.0           12.0
1           22.0           13.0
2            9.0           31.0

如果需要手动筛选列:

df['Conti_mV_XSCI'] = df.filter(like='XSCI').sum(axis=1)
df['Conti_mV_XSCO'] = df.filter(like='XSCO').sum(axis=1)

编辑:列名称开头列表中指定的仅求和列的一个想法:

cols = ['IOZH_Pat_uA', 'IOZL_Pat_uA', 'Power_Short_uA', 'IDDQ_uA']

for c in cols:
    # here ^ is for start of string
    columns = df.filter(regex=f'^{c}')
    df[c] = columns.sum(axis=1)
    df = df.drop(columns, axis=1)
print (df)

这将为名称以Conti_mV_XSCI开头的任何列添加带有第一个非nan项的列Conti_mV_XSCI

from math import isnan

df['Conti_mV_XSCI'] =  df.filter(regex=("Conti_mV_XSCI.*")).apply(lambda row: [_ for _ in row if not isnan(_)][0], axis=1)

尝试:

df['Conti_mV_XSCI']=df.filter(regex='XSCI').sum()
df['Conti_mV_XSCO']=df.filter(regex='XSCO').sum()

编辑:

在执行上述操作之前,可以使用零填充NA

df=df.fillna(0)

相关问题 更多 >