将数据帧Pandas的列更改为其中一列的值

问题描述 投票:2回答:1

我有一个看起来像这样的数据表

                              Value      
Code                          ABCD GFHTI
Time                                    
20100101_00:01:33.436-92.451    24  None
20100101_00:01:33.638-92.651  None    25

该表是从日志文件中获取的

logparser = parse_filter_logfile('log.txt')
df = pd.DataFrame(logparser, columns = ['Time', 'Code', 'Value'])
df.set_index(['Time', 'Code']).unstack(-1)

我使用df.pivot(index='Time', columns=['ABCD','GFHTI'])将列更改为ABCD和GFHTI但是我得到以下错误KeyError:'找不到ABCD级别'。

Time                           ABCD GFHTI           
20100101_00:01:33.436-92.451    24  None
20100101_00:01:33.638-92.651  None    25

我希望有一个列名称的表,看起来像这样:

这有什么工作吗?

这是完整的代码log.txt

20100101_00:01:33.436-92.451 BLACKBOX ABCD ref 2183 value 24 
20100101_00:01:33.638-92.651 BLACKBOX GFHTI  ref 2183 value 25 
20100101_00:01:33.817-92.851 BLACKBOX AAAA ref 2183 value 26   
20100101_00:01:34.017-93.051 BLACKBOX BBBB ref 2183 value 27  

这个代码:

import pandas as pd
import re

def parse_line(line):
    code_pattern = r'(?<=BLACKBOX )\w+'
    value_pattern = r'(?<=value )\d+'
    code = re.findall(code_pattern, line)[0]
    value = re.findall(value_pattern, line)[0]
    ts = line.split()[0]
    print (type(value))
    return ts, code, value

def parse_filter_logfile(fname):
    with open(fname) as f:
       for line in f:
           data = parse_line(line)
           if data[1] in ['ABCD', 'GFHTI']:
               # only yield rows that match the filter
                print((data))
                yield data

logparser = parse_filter_logfile('log.txt')
df = pd.DataFrame(logparser, columns = ['Time', 'Code', 'Value'])

df.set_index(['Time', 'Code']).unstack(-1)

先感谢您。

python pandas dataframe pivot-table
1个回答
2
投票

看来你有一个MultiIndex的列,所以只是使用droplevel降低水平,应该没问题。

df = df.set_index(['Time', 'Code']).unstack(-1)
df.columns = df.columns.droplevel(0)

df

Code                          ABCD GFHTI
Time                                    
20100101_00:01:33.436-92.451    24  None
20100101_00:01:33.638-92.651  None    25
© www.soinside.com 2019 - 2024. All rights reserved.