根据定义的列名转置数据帧

2024-10-05 14:26:59 发布

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

所以我有一些服务器日志,我正试图解析成表格格式。想象一下日志的结构是这样的

a = "value1"
b = "value2"
c = "value3"
a = "value4"
c = "value5"
a = "value2"
b = "value12"
c = "value8"

其中,我对“记录”(或最终数据帧中的行)的定义是从a到C的所有列。实际上大约有30列,起始列名和结束列名总是相同的

我可以很容易地将此文件读入列表(使用split(“=”)函数),并得出如下结果: 索引值

1 ['a , 'value1']
2 ['b , 'value2']
3 ['c , 'value3']
4 ['a , 'value4']
5 ['c , 'value5']
6 ['a , 'value2']
7 ['b , 'value12']
8 ['c , 'value8']

我甚至可以将其转换为1记录数据帧,如下所示: df=pd.DataFrame(List.transpose()) 但我到达了一个重复列的数据帧 像

a          b       c       a1       c2     a3       b1        c3 
value1, value2, value3, value4, value5, value2, value12, value8

我真正想要的是这样的东西:

A          B        C
Value1   Value2   Value3
Value4   NULL     Value5
Value2   Value12  Value8

有没有想过如何执行转置步骤,让它在每次看到“c”时在数据帧中插入一条新记录,并一直写入,直到下次看到c时,在没有记录的特定列中放置一个空值

我这样做完全不对吗


Tags: 数据服务器格式记录表格想象value1value2
1条回答
网友
1楼 · 发布于 2024-10-05 14:26:59

使用:

df[['a','b']] = df['col'].str.split('\s+=\s+', expand=True)

df = (df.set_index([df['a'].eq('a').cumsum(), 'a'])['b']
       .unstack()
       .rename_axis(None, 1)
       .rename_axis(None))
print (df)
          a          b         c
1  "value1"   "value2"  "value3"
2  "value4"       None  "value5"
3  "value2"  "value12"  "value8"

详细信息

print (df['a'].eq('a').cumsum())
0    1
1    1
2    1
3    2
4    2
5    3
6    3
7    3
Name: a, dtype: int32

说明

  1. 第一个^{}col由regex \s+=\s+-1 or more whitepaces with =
  2. 通过^{}创建MultiIndex,通过比较起始值a^{}^{}创建Series
  3. 通过^{}重塑形状
  4. ^{}执行的最后一次数据清理

相关问题 更多 >