【问题标题】:Transpose DataFrame based on Column Name Defined Range根据列名定义的范围转置 DataFrame
【发布时间】:2018-04-11 18:45:20
【问题描述】:

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

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

我对“记录”的定义(或我的最终 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 值特定的列?

我这样做完全不正确吗?

【问题讨论】:

    标签: python pandas dataframe transform


    【解决方案1】:

    用途:

    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. 第一个splitcol 通过正则表达式\s+=\s+ - 1 or more whitepaces with =
    2. 通过将aeqcumsum 比较的起始值Series 创建MultiIndex set_indexSeries
    3. unstack重塑
    4. rename_axis 的最后一次数据清理

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多