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

Python:当组标签和单个单元位于原始数据的同一列中时,为它们创建单独的列,python,pandas,indexing,grouping,multi-level,Python,Pandas,Indexing,Grouping,Multi Level,我是Python新手,我怀疑以前可能有人问过这个问题,但我确实找不到任何相关的线程。因此,这是一个问题 我打算创建一个数据框架,其中包含“组标签”和“单个单元”的单独列,但原始数据的结构如下: 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 gro

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

我打算创建一个数据框架,其中包含“组标签”和“单个单元”的单独列,但原始数据的结构如下:

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

这些字符串实际上是名为
group1
unit\u a
的字符串,还是您在这里使用占位符来表示一些实际数据?谢谢提醒!它们是字符串(组名、个人名)。感谢您的回复。我添加了方括号来子集原始数据框,该数据框给出了几个唯一的组名。mask=df[df['data'].str.contains(“group”)]但对于以df[mask]开始的第二步,由于mask和df是不同长度的数据帧,因此建议的方法将不起作用。我将继续研究您提供的代码。我在另一个论坛上看到,建议使用部分字符串匹配,但我目前无法做到这一点。更新:抱歉,我没有看到你的更新代码。我将尝试实现它。我陷入了困境。query('data!=group')Python返回一条错误消息,其中缺少“data”的定义。.query('data!=group')中的“data”是等同于df['a']或df的数据帧吗?谢谢你。它是示例数据框中标记为
data
的列。它可以工作!可以肯定的是,代码没有问题。我对“DataFrame.query()”中的字符串问题理解缓慢,这是罪魁祸首。也就是说,您的代码(和这个线程)提高了我对这个问题的理解。非常感谢。稍后我会发布我修改过的代码。