根据列名定义范围转置DataFrame

时间:2018-04-11 18:45:20

标签: python pandas dataframe transform

所以我有一些服务器日志,我正在尝试解析为表格格式。想象一下,日志的结构如下

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

我对'record'(或我的最终DataFrame中的行)的定义是从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() 但是我到达了一个重复列的DataFrame 像

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”时在DataFrame中插入新记录并继续写入直到下次看到C时,将NULL值放在没有记录的情况下特定栏目?

我完全错误地解决了这个问题吗?

1 个答案:

答案 0 :(得分:0)

使用:

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\s+=\s+ 1 or more whitepaces with = - MultiIndex
  2. 通过Series创建a,并将2 0 splitset_index
  3. 进行比较,创建String[] nodes = new String[3]; boolean in; int index = 0; int hash = "hi".hashCode(); in = (nodes[(index = nodes.length - 1) & hash]) != null; System.out.println(index); index = (nodes.length - 1) & hash; System.out.println(index);
  4. 重塑eq
  5. cumsum
  6. 的最后数据清理工作