【问题标题】:Extract value in column to new columns将列中的值提取到新列
【发布时间】:2020-11-25 05:20:11
【问题描述】:

我想将列内部提取到几列。这是导入数据框后的原始数据。

data = {'ID':  ['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
        'Name': ['John', 'Micheal', 'Angle', 'Jim', 'Rome'],
        'Details': ['Type:\nHouse\nVector:\nTriangle\n\nMission:\nCompleted,lv5\n\nNote user:\n#', 'Type:\n#\nVector:\n\n\nMission:\nFailed\nNote user:\n#', 'Type:\nCar\nVector:\nSquare\nMission:\nCompleted\nNote user:\n', 'Type:\n#\nVector:\n#\nMission:\nCompleted without award\n\nNote user:\nNo end', 'Type:\n#\nVector:\n#\nMission:\n\n\nNote user:\nThere are many mistake.\nI cant choose.\nI cant buy.']
        }

df = pd.DataFrame (data, columns=['ID', 'Name', 'Details'])
df

ID      Name    Details
A0001   John    Type:\nHouse\nVector:\nTriangle\n\nMission:\nCompleted,lv5\n\nNote user:\n#
A0002   Micheal Type:\n#\nVector:\n\n\nMission:\nFailed\nNote user:\n#
A0003   Angle   Type:\nCar\nVector:\nSquare\nMission:\nCompleted\nNote user:\n
A0004   Jim     Type:\n#\nVector:\n#\nMission:\nCompleted without award\n\nNote user:\nNo end
A0005   Rome    Type:\n#\nVector:\n#\nMission:\n\n\nNote user:\nThere are many mistake.\nI cant choose.\nI cant buy.

我想提取详细信息列中的值。但我不知道该怎么做。

我的预期数据看起来像

data = {'ID':  ['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
        'Name': ['John', 'Micheal', 'Angle', 'Jim', 'Rome'],
        'Type': ['House', '#', 'Car', '#', '#'],
        'Vector': ['Triangle', '', 'Square', '#', '#'],
        'Mission': ['Completed,lv5', 'Failed', 'Completed', 'Completed without award', ''],
        'Note user': ['#', '#', '', 'No end', 'There are many mistake.I cant choose.I cant buy.']
        }

df = pd.DataFrame (data, columns=['ID', 'Name', 'Type', 'Vector', 'Mission', 'Note user'])
df



ID      Name    Type    Vector      Mission                      Note
A0001   John    House   Triangle    Completed,lv5                #
A0002   Micheal #                   Failed                       #
A0003   Angle   Car     Square      Completed   
A0004   Jim     #       #           Completed without award      No end
A0005   Rome    #       #                                        There are many mistake.I cant choose.I cant buy.

【问题讨论】:

  • 看起来您想按\n 拆分列并将所有值存储到不同的列中
  • 类似但有一些值\n\n\n标题也是带冒号的单词(例如,Type: Vector: Mission: Note:)。

标签: python pandas dataframe data-extraction


【解决方案1】:

这是我尝试过的:Details 中的第一个值是:

'Type:\nHouse\nVector:\nTriangle\n\nMission:\nCompleted,lv5\n\nNote user:\n#'

我编写了这个函数来提取细节到dict。我对数组的索引进行了硬编码,但如果您愿意,可以选择不这样做:

def extract_details(text):
    array = text.replace("\n\n", "\n").split("\n")
    return {
        array[0].replace(":", ""): array[1],
        array[2].replace(":", ""): array[3],
        array[4].replace(":", ""): array[5],
        array[6].replace(":", ""): array[7]
    }

将函数应用于整个列:

df['Details'].apply(extract_details)

将此新列连接到原始列:

pd.concat([
    df,
    pd.DataFrame(df['Details'].apply(extract_details).apply(pd.Series))
], axis=1)

【讨论】:

    【解决方案2】:

    您可以使用regex 来获取答案。附上文档链接。

    首先,我将所有\n 替换为''。这样一来,所有换行符都会从 Details 列中删除。

    然后我抓取两个关键字之间的所有文本。 对于类型,数据介于'Type:''Vector:' 之间。 Vector 和 Mission 也是如此。注意,我正在获取'Note user:' 之后的所有数据。现在您已经从Details 列中提取了数据,您可以删除该列。

    import pandas as pd
    data = {'ID':  ['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
            'Name': ['John', 'Micheal', 'Angle', 'Jim', 'Rome'],
            'Details': ['Type:\nHouse\nVector:\nTriangle\n\nMission:\nCompleted,lv5\n\nNote user:\n#', 'Type:\n#\nVector:\n\n\nMission:\nFailed\nNote user:\n#', 'Type:\nCar\nVector:\nSquare\nMission:\nCompleted\nNote user:\n', 'Type:\n#\nVector:\n#\nMission:\nCompleted without award\n\nNote user:\nNo end', 'Type:\n#\nVector:\n#\nMission:\n\n\nNote user:\nThere are many mistake.\nI cant choose.\nI cant buy.']
            }
    
    df = pd.DataFrame (data, columns=['ID', 'Name', 'Details'])
    
    df['Details'] = df.Details.str.replace('\n','', regex=True)
    df['Type']    = df.Details.str.extract('Type\:(.*)Vector')
    df['Vector']  = df.Details.str.extract('Vector\:(.*)Mission')
    df['Mission'] = df.Details.str.extract('Mission\:(.*)Note')
    df['Note']    = df.Details.str.extract('Note user\:(.*)')
    
    print (df[['ID','Name','Type','Vector']])
    print (df[['Mission','Note']])
    

    这个输出将是:

          ID     Name   Type    Vector
    0  A0001     John  House  Triangle
    1  A0002  Micheal      #          
    2  A0003    Angle    Car    Square
    3  A0004      Jim      #         #
    4  A0005     Rome      #         #
    
                       Mission                                              Note
    0            Completed,lv5                                                 #
    1                   Failed                                                 #
    2                Completed                                                  
    3  Completed without award                                            No end
    4                           There are many mistake.I cant choose.I cant buy.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多