Python:当组标签和单个单元在原始数据的同一列中时,为组标签和单个单元创建单独的列

Python: creating separate columns for group labels and individual units when both are in the same column of the original data

我是 Python 的新手,我怀疑这个问题以前可能有人问过,但我真的找不到任何相关的话题。因此,问题。

我打算为 "group labels" 和 "individual units," 创建一个包含单独列的数据框,但原始原始数据的结构如下:

import pandas as pd
df = pd.read_table('df.txt',  names = 'data')

上面写着

        data
0 group1
1 unit_a
2 unit_b
3 group2
4 unit_c
5 unit_d
6 unit_e
7 group3
8 unit_f
9 unit_g
...

但我想创建这样的数据框

       Group   Unit
    0 group1 unit_a
    1 group1 unit_b
    2 group2 unit_c
    3 group2 unit_d
    4 group2 unit_e
    5 group3 unit_f
    6 group3 unit_g
    ...

也就是说,在原始数据中,单位列在各自的组标签下,它们都列在同一列中,而每个组可能包含不同数量的单位。所以我很难使用间隔或其他方法对数据进行切片。如何将原始数据排序或切片为我想要的两列数据框类型输出?

提前致谢。

一种非常基本的方法是使用 str.contains 分配一个具有屏蔽值的新列,过滤列匹配的行(例如 group1, group1),然后重置索引。

df = (df.assign(group=df[df.data.str.contains('group')])
        .ffill()
        .query('data != group')
        .reset_index(drop=True)
        .rename(columns={'data':'unit'}))

我忍不住觉得有一种更简单的方法可以解决这个问题。

演示

>>>> (df.assign(group=df[df.data.str.contains('group')])
        .ffill()
        .query('data != group')
        .reset_index(drop=True))  
        .rename(columns={'data':'unit'}))

     unit   group
0  unit_a  group1
1  unit_b  group1
2  unit_c  group2
3  unit_d  group2
4  unit_e  group2
5  unit_f  group3
6  unit_g  group3