pandas Python中的正则表达式选择列

zyfwsgd6  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(116)

我有一个数据框,其中包含以下列

Name   Company generic name generic name R&D Number (DC-) R&D Number (A)   type 
A      AB      53654        5767         1111             3333             a
C      CD      56767                     56667

我想创建这个数据框的一个子集,并通过用','聚合值来将列与模式组合起来
所需输出为:

Name   Company generic name        R&D Number   
A      AB      53654, 5767         1111, 3333             
C      CD      56767               56667

我发现有一种基于正则表达式过滤列的方法,如下面的df.filter(regex =("R & D Number. *"))
但是有没有一种方法可以与其他列连接,并通过','连接值以获得最终输出。任何帮助都非常感谢

7cjasjjr

7cjasjjr1#

您可以通过删除尾部的(xx)部分(如果需要,可以调整确切的逻辑),然后在列上删除groupby来聚合值,从而规范化名称:

out = (df.groupby(df.columns.str.replace(r'\s*\(.+\)$', '', regex=True), axis=1)
         .agg(lambda g: g.replace('', None).stack().astype(str)
                         .groupby(level=0).agg(','.join))
      )

或者使用双重transpose技巧:

out = (df.T
       .groupby(df.columns.str.replace(r'\s*\(.+\)$', '', regex=True))
       .agg(lambda g: ','.join(g.replace('', None).dropna().astype(str)))
       .T
      )

输出:

Company Name R&D Number generic name type
0      AB    A  1111,3333   53654,5767    a
1      CD    C      56667        56767  NaN

可复制输入:

df = pd.DataFrame.from_dict({'index': [0, 1],
                             'columns': ['Name', 'Company', 'generic name', 'generic name', 'R&D Number (DC-)', 'R&D Number (A)', 'type'],
                             'data': [['A', 'AB', '53654', '5767', '1111', '3333', 'a'], ['C', 'CD', '56767', '', '56667', '', '']],
                             'index_names': [None],
                             'column_names': [None]},
                            orient='tight')

相关问题