【问题标题】:moving field to a new column if it contains value in a certain column如果字段包含某列中的值,则将字段移动到新列
【发布时间】:2019-01-10 10:07:23
【问题描述】:
LINE    TXOBJECT    TXNAME  TXID    LANG TXLINES
1       KNMT         1234   0001     EN
2         *          MEA
2         *          MEB
2         *          MEB
1       KNMT        12345   0001     EN
2         *          MEN
2         *          MED
2         *          MEC
1       KNMT        123456  0001     EN
2         *          LADY
2         *          BOY
2         *          DUDE

我有一个文件,我需要在新列中添加一些字段,因此我能够将我想要的字段放在新行中,但我无法将第 2 行的 TXNAME 列放入TXLINES 列。

我不知道我对我想要什么的解释是否正确,但我会在下面解释我需要什么

我想要下面这个。

LINE    TXOBJECT    TXNAME  TXID    LANG TXLINES
1       KNMT         1234   0001     EN  MEA MEB MEB
1       KNMT        12345   0001     EN  MEN MED MEC
1       KNMT        123456  0001     EN  LADY BOY DUDE

请就执行此操作的最佳方法提出建议。谢谢。

【问题讨论】:

    标签: python excel pandas csv


    【解决方案1】:

    这是一种方法:

    g = df.groupby((df.LINE == 1).cumsum())
    txl = g['TXNAME'].apply(lambda x: x[1:].values).values
    df = g.head(1).assign(TXLINES=txl).reset_index(drop=True)
    

    完整示例:

    import pandas as pd
    import numpy as np
    
    data = '''\
    LINE    TXOBJECT    TXNAME  TXID    LANG TXLINES
    1       KNMT         1234   0001     EN
    2         *          MEA
    2         *          MEB
    2         *          MEB
    1       KNMT        12345   0001     EN
    2         *          MEN
    2         *          MED
    2         *          MEC
    1       KNMT        123456  0001     EN
    2         *          LADY
    2         *          BOY
    2         *          DUDE'''
    
    fileobj = pd.compat.StringIO(data)
    df = pd.read_csv(fileobj, sep='\s+').fillna('')
    
    # Restructure
    g = df.groupby((df.LINE == 1).cumsum())
    txl = g['TXNAME'].apply(lambda x: x[1:].values).values
    df = g.head(1).assign(TXLINES=txl).reset_index(drop=True)
    
    print(df)
    

    返回:

       LINE TXOBJECT  TXNAME TXID LANG            TXLINES
    0     1     KNMT    1234    1   EN    [MEA, MEB, MEB]
    1     1     KNMT   12345    1   EN    [MEN, MED, MEC]
    2     1     KNMT  123456    1   EN  [LADY, BOY, DUDE]
    

    解释

    这里的目的是捕获所有TXOBJECT == "*" 的行,一种方法是使用我们得到一个 LINE 列的事实。通过选择值为1 的行并应用 cumsum() 我们可以将这些行分组。从这里我们进行 twp 操作:获取 txlines 值,然后我们获取每个组的第一行并重组您的数据。

    而通过使用txl = g['TXNAME'].apply(lambda x: ' '.join(x[1:])).values,你会得到:

       LINE TXOBJECT  TXNAME TXID LANG        TXLINES
    0     1     KNMT    1234    1   EN    MEA MEB MEB
    1     1     KNMT   12345    1   EN    MEN MED MEC
    2     1     KNMT  123456    1   EN  LADY BOY DUDE
    

    如果更清楚,您也可以将 txl = 更改为:

    txl = g['TXNAME'].apply(list).str[1:].values
    

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2010-09-14
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多